Spring RestTemplate请求对象无法映射到Rest Controller问题排查
RestTemplate请求参数映射失败问题排查
问题场景
使用RestTemplate发送JSON格式的POST请求调用目标服务的Controller,但目标Controller接收的UserMO对象中age字段始终为0,无法正确映射传入的值。相关代码如下:
调用方RestTemplate代码
@Override public ResponseEntity<String> callRestAPI(APIReqDataMO apiReqDataMO) { String apiURL = URIGenerator.getAPIURL(apiReqDataMO); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); HttpEntity<?> request = new HttpEntity<>(apiReqDataMO.getRequestObject(), headers); ResponseEntity<String> httpRes = restTemplate.postForEntity(apiURL, request, String.class); return httpRes; }
目标服务Controller代码(原版本)
@RequestMapping(value = "/targetService/createUser", method = RequestMethod.POST, consumes = "application/json") public String fuzzerServiceAge(UserMO userMO) { System.out.println("---------------------age is -------------------------" + userMO.getAge()); if (userMO.getAge() > 0) { System.out.println("error age greater than 0 "); return "invalid user age"; } else if (userMO.getAge() == 0) { return "invalid user age"; } return "user added successfully"; }
相关实体类代码
APIReqDataMO
public class APIReqDataMO { private String restAPIURL; private Object[] pathParam; private Object[] requestParam; private String requestType; private String paramType; private Object requestObject; // getter和setter方法省略 }
UserMO
public class UserMO { @JsonProperty("name") private String name; @JsonProperty("age") private int age; // getter和setter方法省略 }
问题原因分析
目标Controller缺少
@RequestBody注解
这是核心问题:调用方发送的是JSON格式的请求体,但目标Controller的方法参数UserMO userMO没有添加@RequestBody注解。Spring MVC默认会将无注解的参数视为**请求参数(如URL参数、表单参数)**进行绑定,而不是解析请求体中的JSON内容。因此UserMO会被实例化为默认值(int类型的age默认值为0)。可选检查点:RestTemplate消息转换器配置
如果是手动创建的RestTemplate,需要确保配置了MappingJackson2HttpMessageConverter来支持JSON序列化/反序列化。不过Spring Boot环境下会自动配置该转换器,所以这个问题出现概率较低,但如果是自定义RestTemplate实例,需要确认是否添加了对应的消息转换器。
解决方案
1. 为目标Controller参数添加@RequestBody注解
修改目标服务的Controller方法,在UserMO参数前添加@RequestBody注解,告诉Spring解析请求体中的JSON并绑定到UserMO对象:
@PostMapping("/targetService/createUser") public String fuzzerServiceAge(@RequestBody UserMO userMO) { System.out.println("--------------------- age is -------------------------" + userMO.getAge()); if (userMO.getAge() > 0) { // 原有逻辑 } else if (userMO.getAge() == 0) { System.out.println(" it is else block"); // 原有逻辑 } return "user added successfully"; }
2. 额外验证步骤
- 确认
APIReqDataMO中的requestObject是正确构造的UserMO实例,且age字段已设置了预期值; - 如果是手动创建RestTemplate,确保添加了Jackson消息转换器:
RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
内容的提问来源于stack exchange,提问作者pappu_kutty
相关产品推荐
相关产品推荐

