详解spring cloud feign踩坑记录
1:多客户端时,feign接口抽取到公共jar中,此时,客户端的启动类上需要对该jar中feign所在的包进行扫描,要在spring和feign中同时注册,否则启动时会报:“Considerdefiningabeanoftype'******Feign'inyourconfiguration.”
@SpringBootApplication
@EnableTransactionManagement
@EnableDiscoveryClient
@ComponentScan(basePackages={"com.lcamtech.aidis.feign","com.lcamtech.aiads.dts"})
@EnableFeignClients(basePackages={"com.lcamtech.aidis.feign"})
@EnableCaching
@MapperScan(basePackages="com.lcamtech.aiads.dts.mapper")
publicclassApplicationextendsSpringBootServletInitializer{
publicstaticvoidmain(String[]args){
SpringApplication.run(Application.class,args);
}
}
重点:
@ComponentScan(basePackages={"com.lcamtech.aidis.feign","com.lcamtech.aiads.dts"})
@EnableFeignClients(basePackages={"com.lcamtech.aidis.feign"})
aidis包为包含feign的jar,此时@ComponentScan还需要同时扫描本项目的包。
2:使用Fegin传值时,GET变POST
@FeignClient(value="SERVICE-NAME")
publicinterfaceUserAccountFeign{
@RequestMapping(value="/ac/exist",method=RequestMethod.GET)
publicBaseResultisExist(@RequestParam("mobile")Stringmobile);
}
feign在传递时默认会将数据放在RequestBody中,所以会导致默认使用POST请求(及时@RequestMapping写着GET也没用),此时需要在参数列表中声明@RequestParam才能进行正常的GET请求。
3:feign请求返回复杂对象时
如:
publicclassResult{
privatestringcode;
privatestringmessage;
privateObjectdata;
//get/set
}
问题描述:当请求返回的是Result的一个对象时,对于该对象内部的data值,会变成一个linkedHashMap,并不会被转换成相应的类对象,若直接强转会报类型错误。
解决方法1:简单转换
/** *@Description:将数据转换到相应的容器 *@parambean *@paramclazz *@return *@throws *@authorSunF *@date2018/6/2010:28 */ publicstaticTconvertValue(Objectbean,Class clazz){ try{ ObjectMappermapper=newObjectMapper(); returnmapper.convertValue(bean,clazz); }catch(Exceptione){ log.error("错误的转换:BeanUtil.convertValue()--->"+e.getMessage()); returnnull; } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。