急求,SpringCloud传递Fegin接口,服务端将查询出来的数据放入ResponseEntity的Body当中,客户端拿到的Body总是为null

u011013470 2019-06-28 05:02:21

SpringCloud传递Fegin接口,服务端将查询出来的数据放入ResponseEntity的Body当中,客户端拿到的Body总是为null。



项目当中所有SpingMVC的接口的返回结果集都是用ResponseEntity来返回,我在介个服务端的接口当中,将查询出来的数据放入ResponseEntity的Body当中,客户端调用SpringCloud Feign接口接收到的ResponseEntity当中的Body总是null.


Fegin配置文件

@Configuration
@ConditionalOnClass(RequestContext.class)
public class FeignClientConfiguration {

@Bean
public RequestInterceptor headerTokenInterceptor() {
return new RequestInterceptor() {
@Override
public void apply(RequestTemplate requestTemplate) {
HttpServletRequest request = RequestContext.getHttpRequest();
if(request == null)
return;
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
requestTemplate.header(name, request.getHeader(name));
}
}
}
};
}
}


服务端接口:

/**
* 通过用户名称查询用户信息
* @param username
* @return
*/
@PostMapping(value = "/findUserByUserName")MediaType.APPLICATION_JSON_VALUE)
@ApiOperation(value = "通过用户名称查询用户信息接口")
@CrossOrigin(origins = {"*"}, allowCredentials = "true")
public ResponseEntity findUserByUserName(@RequestParam(value = "username") String username) {
log.debug("findUserByUserName parameter : {}", username);
UserVo user = new UserVo();
user.setUsername(username);
user = userInfoService.findUserList(user).get(0);
if (user != null) {
log.debug("findUserByUserName success!");
ResponseResult result = ResponseResult.success(user);
ResponseEntity responseEntity = ResponseEntity.ok().body(result);

ResponseEntity responseEntity2 = ResponseEntity.ok(result);
ResponseEntity responseEntity3 = new ResponseEntity(result, HttpStatus.OK);
ResponseEntity responseEntity4 = new ResponseEntity(user, HttpStatus.CONTINUE);
return responseEntity3;
}
log.debug("findUserByUserName failed!");
return ResponseEntity.ok(ResponseResult.failure("通过用户名称查询用户信息接口失败"));
}


Fegin接口

@FeignClient(value = "service-userserver-xxj", /*configuration = FeignClientConfiguration.class ,*/ url="localhost:5090" )
public interface UserClient {

/**
* 通过用户名称查询用户信息
* @param username
* @return
*/
@PostMapping(value = "/api/userserver_xxj/user/findUserByUserName")
public ResponseEntity findUserByUserName(@RequestParam(value = "username") String username);


}


客户端接口

@RequestMapping("/auth")
@RestController
public class AuthController {

// 用户Fegin接口
@Resource
private UserClient userClient;

@ResponseBody
@RequestMapping(value = "/findUserByUserName", method = RequestMethod.POST)
@ApiOperation(value = "查询用户信息", notes = "查询用户信息")
public ResponseEntity findUserByUserName(@RequestBody AddUserInfoCnd user) throws Exception{
// 查询用户信息
ResponseEntity responseEntity = userClient.findUserByUserName(user.getUsername());
ResponseResult result = (ResponseResult)responseEntity.getBody();
Object data = result.getData();
UserVo userVo = (UserVo)(data);
if (userVo != null) {
return ResponseEntity.ok(ResponseResult.success(userVo));
}
return ResponseEntity.ok(ResponseResult.failure("用户注册失败"));
}

}

1,开始用Swagger进行测试




2、断点跳入客户端调用方法




3、断点进入FeginConfig配置类的请求头部拦截器当中




4、断点通过SpringCloud的Feign接口进入服务端的Controller接口当中




5、将查询到的用户数据放入返回结果集的Body当中




6、客户端Controller调用SpringCloud的Feign接口返回的结果集当中Body却为null




我今天,做了多次测试,整整搞了一天,把所有的Filter、Interceptor等过滤器和拦截器和SpringSecurity拦截配置都停掉了,还是报这个问题!!!

有没有大哥大姐们遇到过这个问题,本人在这里急求这个问题的答案。

小弟先在这里谢谢各位了!!!


...全文
2767 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
心之归处 2021-05-21
  • 打赏
  • 举报
回复
没加泛型,加了就不会返回null了,但是加了泛型,问题就多了
u011013470 2020-07-29
  • 打赏
  • 举报
回复
引用 8 楼 qq_42928777 的回复:
你好楼主,请问你的这个问题后来是怎么解决的啊
接口两端都加上范型的实体类,就可以调通数据了!!!
qq_42928777 2020-07-27
  • 打赏
  • 举报
回复
你好楼主,请问你的这个问题后来是怎么解决的啊
我表示我来过 2019-12-09
  • 打赏
  • 举报
回复
额,这个具体原因估计得看源码实现。就像我上面我猜测的,feign client 估计已经将controller返回的responseEntity对象里面的body值解析出来,赋值给了接口,实际返回的就不是responseEntity对象了。是你们具体的body值
星空之下丶 2019-12-08
  • 打赏
  • 举报
回复
引用 4 楼 我表示我来过 的回复:
feign client 底层调用的restTemplate,应该是已经将controller返回的responseEntity里面的body,已经解析为interface的返回类型。两边都是responseEntity,估计解析赋值不到。
你好,请问一下,为什么两边都是responseEntity,会解析赋值不到?
我表示我来过 2019-12-02
  • 打赏
  • 举报
回复
feign client 底层调用的restTemplate,应该是已经将controller返回的responseEntity里面的body,已经解析为interface的返回类型。两边都是responseEntity,估计解析赋值不到。
我表示我来过 2019-12-02
  • 打赏
  • 举报
回复
楼主你好,本人今天也遇到了跟你同样的问题,不知道你的问题解决了没。我这边尝试了下不同的接收方式,问题已解决。如图;
光哥_帅 2019-10-08
  • 打赏
  • 举报
回复 1
https://blog.csdn.net/qq_37948985/article/details/86702692,你看看这个
散着步的码农 2019-06-28
  • 打赏
  • 举报
回复
有可能,我不确定啊,有可能你的服务端有userVo类,但是你的客户端没有userVo类,如果都有,那就还有一种可能,因为data的类型是Object 类 类下并没有set/get 方法,所以数据传不过去,只是猜的,我不用ResponseResult 传对象,都是自己定义好一个通用类推向加泛型传过去,没碰到过这种问题

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧