Java内部调用Spring Controller时,无法通过HTTP POST传递请求参数
解决Java内部调用POST Controller参数传递问题
看起来你在内部调用POST接口时踩了几个常见的坑,我来帮你梳理下问题并给出解决方案:
问题根源分析
你的Controller定义了两种参数类型,但当前调用方式完全没匹配上:
@RequestBody Map<String, String> colMapObj:这个参数是从HTTP请求体的JSON数据中解析的,但你现在的调用只拼接了URL参数,根本没传请求体,所以这个参数肯定拿不到值。@ModelAttribute ReqParam reqParam:虽然这个参数可以从URL query参数绑定,但你手动拼接URL时&前面多了个空格,会导致exportDiscardRec参数被识别为searchData值的一部分,Spring无法正确解析。- 手动拼接URL还容易出现参数编码问题(比如参数含特殊字符),稳定性很差。
正确的调用方式(用RestTemplate)
Java内部调用Spring Controller最常用的工具是RestTemplate,下面是完整的可运行示例:
import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; import java.util.HashMap; import java.util.Map; // 初始化RestTemplate(如果是Spring项目,建议用@Autowired注入) RestTemplate restTemplate = new RestTemplate(); // 1. 准备@RequestBody需要的Map数据(根据业务填充键值对) Map<String, String> colMapObj = new HashMap<>(); colMapObj.put("column1", "value1"); colMapObj.put("column2", "value2"); // 2. 准备@ModelAttribute对应的URL参数 MultiValueMap<String, String> urlParams = new LinkedMultiValueMap<>(); urlParams.add("searchData", reqParam.getSearchData()); // 布尔类型要转成String,避免参数解析异常 urlParams.add("exportDiscardRec", String.valueOf(reqParam.isExportDiscardRec())); // 如果ReqParam还有其他字段,都要在这里添加 // 3. 安全构建请求URI(自动处理编码和参数拼接) URI requestUri = UriComponentsBuilder.fromHttpUrl("http://localhost:8081/LeadM/temp") .queryParams(urlParams) .build() .encode() .toUri(); // 4. 设置请求头(告诉后端我们传的是JSON) HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<Map<String, String>> requestEntity = new HttpEntity<>(colMapObj, headers); // 5. 发送POST请求并获取返回结果 String response = restTemplate.postForObject(requestUri, requestEntity, String.class);
关键注意点
- @RequestBody参数必须放在请求体:通过
HttpEntity把Map包装起来,RestTemplate会自动序列化为JSON发送给后端。 - @ModelAttribute参数用URL query传递:借助
UriComponentsBuilder拼接参数,自动处理URL编码和格式,避免手动拼接的错误。 - 布尔类型参数要转为String:Spring解析URL参数时,布尔值需要传
true/false字符串,直接传布尔对象会导致解析失败。
如果你的项目是Spring Boot,记得确保RestTemplate已经被注入到容器中(可以用@Bean配置),这样更规范。
内容的提问来源于stack exchange,提问作者AJN
相关产品推荐
相关产品推荐

