【问题标题】:How to parse octet-stream as json in Jackson xml parser?如何在 Jackson xml 解析器中将八位字节流解析为 json?
【发布时间】:2019-09-18 22:26:00
【问题描述】:

我有时会收到设置了content-type=application/octet-stream 的网络服务响应,但实际上它是application/xml

由于我无法控制 web 服务,我仍然想告诉 jackson(我与 spring-boot 一起使用)将这些响应解析为 xml。但是怎么做呢?

我首先尝试为 jackson 映射器完全允许八位字节流,它目前有效:

@Bean
public RestTemplateCustomizer customizeJackson2MessageConverter() {
    return restTemplate -> {
        for (var converter : restTemplate.getMessageConverters()) {
            if (converter instanceof MappingJackson2HttpMessageConverter) { 
                jackson.getSupportedMediaTypes().add((MediaType.APPLICATION_OCTET_STREAM);
            }
        }
    };
}

但是:当涉及到解析时,我如何告诉杰克逊忽略/重写内容类型,并且仍然将其解析为普通 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

【问题讨论】:

标签: java spring spring-boot jackson jackson2


【解决方案1】:

我按照@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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-19
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2014-09-18
    相关资源
    最近更新 更多