Spring REST接口未返回JSON响应体问题排查求助
首先咱们拆解下你遇到的问题:能正常获取响应头和状态码,说明RestTemplate和后端服务的连接是通的,核心问题出在响应体的传递或序列化环节。下面是具体的排查方向和解决办法:
1. @JsonSerialize注解的冗余干扰
你的控制器方法同时标注了@ResponseBody和@JsonSerialize,这两个注解在处理String类型返回值时容易产生冲突:
@ResponseBody已经会自动将返回内容作为响应体输出,如果返回的是已序列化好的JSON字符串,它会直接输出;@JsonSerialize是用来指定对象序列化规则的,作用在String类型上时,可能会对JSON字符串做额外处理(比如强制包裹引号),甚至导致输出为空。
解决办法:
直接去掉@JsonSerialize注解,并且尝试直接返回RestTemplate获取的原ResponseEntity(也就是你注释掉的代码),不需要重新构造对象:
@RequestMapping(method = RequestMethod.GET, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<String> handleData(HttpMethod method, HttpServletRequest httpRequest) throws URISyntaxException, IOException { BackendRequest request = new BackendRequest(); request.setHttpRequest(httpRequest); request.setMethod(method); BackendResponse backendResponse = service.getresponse(request); return backendResponse.getResponse(); // 直接返回原ResponseEntity }
2. 确认RestTemplate是否真的拿到了响应体
先排查RestTemplate调用后端服务时,是否获取到了非空的响应体。可以在callBackend方法里添加日志,打印响应体内容:
// 在setResponse前添加日志 LOG.info("后端服务返回的响应体: {}", responseEntity.getBody()); response.setResponse(responseEntity);
如果日志显示body为空,那问题出在后端服务本身(返回了空响应),需要排查后端接口;如果日志显示有正常的JSON内容,那问题就出在控制器的响应输出环节。
3. RestTemplate的消息转换器配置问题
如果后端返回的JSON响应使用了非UTF-8编码,RestTemplate默认的StringHttpMessageConverter可能无法正确解析,导致拿到空字符串或乱码。
解决办法:
手动配置RestTemplate的String消息转换器,指定UTF-8编码:
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); // 替换默认的String消息转换器 for (HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) { if (converter instanceof StringHttpMessageConverter) { ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); break; } } return restTemplate; }
4. 避免不必要的ResponseEntity重构
你当前代码重新构造了ResponseEntity,虽然逻辑上和直接返回原对象一致,但没必要的对象构造可能带来未知问题。直接返回RestTemplate返回的responseEntity是最稳妥的方式。
总结
优先尝试去掉@JsonSerialize并直接返回原ResponseEntity,同时添加日志确认RestTemplate是否拿到响应体,这两步大概率能解决你的问题。如果还是不行,再检查RestTemplate的消息转换器配置。
内容的提问来源于stack exchange,提问作者Popeye

