come analizzare ottet-stream come json in Jackson parser xml?

a volte ricevo una risposta di servizio web in cui il content-type=application/octet-stream è impostato, in ogni modo è in realtà application/xml.

come io non sono in controllo del webservice, Mi piacerebbe ancora dire Jackson (che sto usando con spring-boot) per analizzare quelle risposte come xml. ma come?

per la prima volta ho provato ad ammettere il mapper di Jackson, che funziona fino ad ora:

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

ma: quando poi si tratta di analizzare, come posso dire a Jackson di ignorare / riscrivere il tipo di contenuto, e ancora parse come normale 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

EN From: How to parse octet-stream as json in Jackson xml parser?

More similar articles:

3 Comments

  1. potrebbe essere un approccio migliore scrivere un intercettore che riscrive il Content-Type quando rileva octet-stream.

  2. ho fatto come consigliato da @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;
        }
    }

Leave a Reply

Your email address will not be published. Required fields are marked *