Как проанализировать поток октетов как json в парсере Джексона xml? - PullRequest
0 голосов
/ 30 апреля 2019

Иногда я получаю ответ веб-службы, где установлен content-type=application/octet-stream, в любом случае это на самом деле application/xml.

Поскольку я не контролирую веб-сервис, я все же хотел бы сказать Джексону (что я использую с spring-boot), чтобы проанализировать эти ответы как xml. Но как?

Сначала я попытался вообще разрешить поток октетов для картографа Джексона, который работает до сих пор:

@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

1 Ответ

0 голосов
/ 30 апреля 2019

Я сделал, как советовал @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;
    }
}
...