目录

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);
}