Java 如何在Jackson xml解析器中将八位字节流解析为json?
我有时会收到一个webservice响应,其中设置了Java 如何在Jackson xml解析器中将八位字节流解析为json?,java,spring,spring-boot,jackson,jackson2,Java,Spring,Spring Boot,Jackson,Jackson2,我有时会收到一个webservice响应,其中设置了content-type=application/octet-stream,无论如何,它实际上是application/xml 由于我无法控制Web服务,我仍然希望告诉jackson(我正在使用SpringBoot)将这些响应解析为xml。但是怎么做呢 我第一次尝试为jackson mapper允许八进制流,到目前为止它仍然有效: @Bean public RestTemplateCustomizer customizeJackson2Mess
content-type=application/octet-stream
,无论如何,它实际上是application/xml
由于我无法控制Web服务,我仍然希望告诉jackson(我正在使用SpringBoot
)将这些响应解析为xml。但是怎么做呢
我第一次尝试为jackson mapper允许八进制流,到目前为止它仍然有效:
@Bean
public RestTemplateCustomizer customizeJackson2MessageConverter() {
return restTemplate -> {
for (var converter : restTemplate.getMessageConverters()) {
if (converter instanceof MappingJackson2HttpMessageConverter) {
jackson.getSupportedMediaTypes().add((MediaType.APPLICATION_OCTET_STREAM);
}
}
};
}
但是:当涉及到解析时,我如何告诉jackson忽略/重写内容类型,并且仍然将其解析为普通json
Caused by: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: (ByteArrayInputStream); line: 1, column: 2]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:245) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:227) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:102) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
... 113 more
原因:org.springframework.http.converter.httpMessageNodeTableException:JSON解析错误:意外字符(“我按照@chrylis的建议执行了操作:
public class ContentTypeInterceptor implements ClientHttpRequestInterceptor {
@Override
public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
ClientHttpResponse http = execution.execute(request, body);
HttpHeaders headers = http.getHeaders();
if (headers.getContentType() == MediaType.APPLICATION_OCTET_STREAM) {
headers.setContentType(MediaType.APPLICATION_XML);
}
return http;
}
}
编写一个拦截器,当它检测到八位字节流时重写内容类型
,这可能是一种更好的方法。如上所述,请参阅: