OpenFeign服务调用GET请求传递对象实体类的处理
目录
OpenFeign服务调用GET请求传递对象实体类的处理
场景描述
OpenFeign组件服务间调用的时候,直接调用GET型的实体类参数接口要么参数为空或者报405(Method Not Allowed)
解决方案
下面是被调用服务的示例代码:
//user-server
@GetMapping("/getUserInfo")
public String getUserInfo(User userDTO) {
return userServer.getUserInfo(userDTO);
}方案1: 调用的时候每个参数@RequestParam注解,就是常用的query的写法,这样参数很多就不太适用了
@GetMapping("/userInfo")
public String getData(){
User user = new User();
user.setId(1L);
user.setName("tom");
return userFeignServer.getUserInfo(user.getId(),user.getName());
}
//user-feign-server
@FeignClient(contextId="userService",value="${user-server-application}")
public interface UserFeignServer {
@GetMapping(value = "/user/getUserInfo")
String getUserInfo(@RequestParam("id") Long userId,@RequestParam("name") String name);
}方案2: 将参数转map(springboot版本在2.1之前)
参数转化示例:
@GetMapping("/userInfo")
public String getData(){
User user = new User();
user.setId(1L);
user.setName("tom");
//使用BeanMap工具类或者使用JSON工具类转Map
HashMap query = new HashMap(BeanMap.create(user));
return userFeignServer.getUserInfo(query);
}
//user-feign-server
@FeignClient(contextId="userService",value="${user-server-application}")
public interface UserFeignServer {
//注意这里的参数名需要和user-server的参数名一致
@GetMapping(value = "/user/getUserInfo")
String getUserInfo(@RequestParam("userDTO") Map map);
}方案3: 使用@SrpingQueryMap注解(springboot版本在2.1之后)
//A-service
@GetMapping("/userInfo")
public String getData(){
User user = new User();
user.setId(1L);
user.setName("tom");
//使用BeanMap工具类或者使用JSON工具类转Map
HashMap query = new HashMap(BeanMap.create(user));
return userFeignServer.getUserInfo(query);
}
//user-feign-server
@FeignClient(contextId="userService",value="${user-server-application}")
public interface UserFeignServer {
@GetMapping(value = "/user/getUserInfo")
String getUserMap(@SpringQueryMap User user);
}补充:
使用@SpringQueryMap可能存在的问题:无法解析父类的属性,会导致类型不一致报错 Failed to convert value of type 'xxx' to required type 'xxx'
解决方案:添加Feign配置类
@Configuration
public class FeignClientConfiguration {
/**
* 替换解析 queryMap 的类,实现父类中变量的映射
* @return
*/
@Bean
public Feign.Builder feignBuilder() {
return Feign.builder()
.queryMapEncoder(new BeanQueryMapEncoder())
.retryer(Retryer.NEVER_RETRY);
}
}
@FeignClient(contextId="userService",value="${user-name}",configuration = FeignClientConfiguration.class)
public interface UserFeignServer {
@GetMapping(value = "/user/getUserInfo")
String getUserMap(@SpringQueryMap User user);
}
//全局生效设置Spting boot 启动类上添加注解:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
//单个 `FeignClient` 上生效,@FeignClient注解添加 `configuration` 属性
@FeignClient(contextId="userService",value="${user-server-application}", configuration = FeignClientConfiguration.class)
public interface UserFeignServer {
@GetMapping(value = "/user/getUserInfo")
String getUserMap(@SpringQueryMap User user);
}