RestTemplate调用Rest服务遇JSON解析错误,需直接发送JSON串请求
解决JSON解析错误并直接发送/接收JSON字符串
问题根源
你碰到的Cannot construct instance of Person...错误,本质是RestTemplate默认会把请求体参数当作Java对象来序列化,但你传入的已经是JSON字符串了,它反而会尝试把这个字符串转成Person类,这就导致了反序列化失败。
解决方案步骤
要直接发送JSON字符串并接收JSON格式的响应,你需要调整代码做这几件事:
- 给请求设置正确的
Content-Type: application/json头,明确告诉服务端你发送的是JSON数据 - 使用
HttpEntity包装JSON字符串和请求头,避免RestTemplate自动序列化你的字符串 - 调用RestTemplate的
exchange方法,明确指定响应类型为String,这样就能直接拿到返回的JSON字符串
修改后的代码示例
@Component public class CallRestService implements CommandLineRunner { @Autowired private RestTemplate restTemplate; @Override public void run(String... args) throws Exception { callRestService(); } private void callRestService() { // 补全你的完整JSON请求体 String requestBody = "{\"id\":\"1\",\"firstName\":\"replacedFirstName\",\"lastName\":\"replacedLastName\"}"; // 1. 设置请求头,指定Content-Type为application/json HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); // 2. 用HttpEntity包装请求体和请求头 HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers); // 3. 调用exchange方法发送请求,指定响应类型为String String responseJson = restTemplate.exchange( "替换为你的Rest服务实际URL", // 替换成你要调用的服务地址 HttpMethod.POST, // 根据服务要求调整请求方式(GET/POST/PUT等) requestEntity, String.class // 直接接收JSON字符串作为响应 ).getBody(); // 处理或打印返回的JSON字符串 System.out.println("服务返回的JSON: " + responseJson); } }
额外注意事项
- 确保你的Rest服务端支持接收JSON格式请求,并且返回的也是JSON格式响应
- 如果是自定义配置的RestTemplate,要保证
StringHttpMessageConverter存在(默认RestTemplate会包含这个转换器,但如果手动替换了消息转换器,记得手动添加它)
内容的提问来源于stack exchange,提问作者Guizmoo03
相关产品推荐
相关产品推荐

