You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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方法省略
}

问题原因分析

  1. 目标Controller缺少@RequestBody注解
    这是核心问题:调用方发送的是JSON格式的请求体,但目标Controller的方法参数UserMO userMO没有添加@RequestBody注解。Spring MVC默认会将无注解的参数视为**请求参数(如URL参数、表单参数)**进行绑定,而不是解析请求体中的JSON内容。因此UserMO会被实例化为默认值(int类型的age默认值为0)。

  2. 可选检查点: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 18:01:13