spring cloud-Feign使用中常见问题

1. java.lang.illegalStateException : Method getChildren not annotated with HTTP method type (ex.post,get)

以下两种注解是等价的

@RequestMapping(value = “/system/regions/parent/{parent_id}”, method = RequestMethod.GET)

@GetMapping(“/regions/parent/{parent_id}”)

但是在Feign的使用中,@GetMapping(“”)是不能直接使用的,所以会出现没有指定HTTP类型的异常

2. java.lang.IllegalStateException: PathVariable annotation was empty on param 0

参数标注不能为空,问题类型同上,

public List<Regions> getChildren(@PathVariable int parent_id) {
return regionsManager.listChildren(parent_id);
}

此方法中使用了@PathVariable int parent_id,而在Feign中应该使用@PathVariable(“parent_id”) int parent_id,或@PathVariable(value=”parent_id”) int parent_id

3. Request method ‘POST’ not supported

在参数的传递中,GET方法使用@RequestParam注解,POST方法使用@RequestBody注解,若传递参数时不加注解,则默认为@RequestBody注解,即POST方法,GET方法中有参数不加@RequestParam,被调用的服务就会提示POST是不被支持的

Spring中使用注解时指定构造器的参数

Spring 使用注解声明Bean时,我们可能会需要指定这个bean的构造函数的参数。
比如在javashop的缓存代理类中,需要指定缓存代理类的构造函数参数为某个被代理对象(实际参数数据库的对象)
可以参考SmptManager和SmtpCacheProxy,其中 SmtpCacheProxy 为缓存代理类,他的构造函数需要SmptManager为参数。
在配置文件生声明方式下,是这样的:

<!-- smtp管理 -->
<bean id="smtpManagerImpl" class="com.enation.app.base.core.service.impl.SmtpManager"></bean>

<!-- smtp缓存代理 -->
<bean id="smtpManager" class="com.enation.app.base.core.service.impl.cache.SmtpCacheProxy">
<constructor-arg>
<ref bean="smtpManagerImpl"/>
</constructor-arg>
</bean>

也就是指定constructor-arg 。
改为注解方式后,要将构造函数加上@Autowired注解,同时参数名指定为注入进来的bean的id:

@Autowired
public SmtpCacheProxy(ISmtpManager smtpManagerImpl){
super(cacheName);
this.smtpManager = smtpDbManager;
}

其中ISmtpManager smtpManagerImpl 的bean为:

@Service("smtpManagerImpl")
public class SmtpManager extends BaseSupport<Smtp> implements ISmtpManager {