第三方Rest API响应格式不符致Spring RestTemplate解析失败如何解决?
解决RestTemplate解析无引号UUID(application/json类型)的问题
这个坑我之前踩过!第三方接口明明把响应的Content-Type设成了application/json,但返回的却是不带引号的纯文本UUID——这完全不符合JSON规范,难怪Jackson解析会炸。下面给你几个靠谱的解决办法:
方法一:添加自定义StringHttpMessageConverter优先解析
既然接口返回的本质是纯文本,我们可以让RestTemplate先尝试用字符串转换器处理application/json类型的响应,绕开Jackson的JSON解析逻辑。具体步骤:
- 创建支持
application/json的StringHttpMessageConverter:
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); stringConverter.setSupportedMediaTypes(Collections.singletonList(MediaType.APPLICATION_JSON));
- 把这个转换器放到RestTemplate的转换器列表最前面(转换器按顺序匹配,优先匹配的会先处理):
RestTemplate restTemplate = new RestTemplate(); List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters(); converters.add(0, stringConverter);
配置完成后,遇到Content-Type为application/json的响应时,会直接用字符串转换器把响应体转成String,完美解决解析报错问题。
方法二:单个请求手动提取响应体
如果你不想修改全局的RestTemplate配置,只针对这一个请求处理,可以用exchange方法代替postForObject,手动获取响应体:
@Test public void test1() { ResponseEntity<String> response = restTemplate.exchange( "/order", HttpMethod.POST, new HttpEntity<>(orderDTO), String.class ); String uuid = response.getBody(); assertThat(uuid).isNotNull(); }
这种方式会直接把响应体作为字符串返回,不需要Jackson参与解析,适合临时处理个别接口的场景。
方法三:修改Jackson配置(不推荐)
你也可以让Jackson接受无引号的单值作为合法JSON,但这种做法会破坏JSON的标准解析规则,可能导致其他正常JSON接口解析出问题,所以除非万不得已,不建议这么做。如果一定要试,需要给Jackson开启允许缺失包裹引号的特性(注意该特性从Jackson 2.10版本开始支持):
MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter(); ObjectMapper objectMapper = jacksonConverter.getObjectMapper(); objectMapper.enable(JsonParser.Feature.ALLOW_MISSING_ENCLOSING_QUOTES); restTemplate.getMessageConverters().replaceAll(converter -> converter instanceof MappingJackson2HttpMessageConverter ? jacksonConverter : converter );
再次提醒:这个方法会让Jackson解析非标准JSON,可能引入其他潜在问题,谨慎使用。
内容的提问来源于stack exchange,提问作者bluelurker
相关产品推荐
相关产品推荐

