A classe SourceHttpMessageConverter não é registrada por padrão

Essa regra sinaliza o uso do javax.xml.transform.Source quando a interface SourceHttpMessageConverter classe é não encontrada. Na estrutura Spring 6.0, o SourceHttpMessageConverter classe é não não é mais registrada por padrão em Spring MVC ou RestTemplate.

Como consequência, os aplicativos da Web Spring que usam javax.xml.transform.Source agora precisa para configurar SourceHttpMessageConverter explicitamente. É importante observar que a ordem de registro do conversor é importante. Por exemplo, SourceHttpMessageConverter devem ser registrado antes de conversores "catch-all" como MappingJackson2HttpMessageConverter.

O trecho de código a seguir mostra o uso de javax.xml.transform.Source:


                @RestController
                public class TransformController {
                    @GetMapping(value = "/transform", produces = MediaType.TEXT_HTML_VALUE)
                    public String transformXml() throws Exception{
                        Source xmlSource = new StreamSource(new ClassPathResource("sample.xml").getInputStream());
                        Source xsltSource = new StreamSource(new ClassPathResource("transform.xslt").getInputStream());
                        StringWriter writer = new StringWriter();
                        Result result = new StreamResult(writer);
                        TransformerFactory factory = TransformerFactory.newInstance();
                        Transformer transformer = factory.newTransformer(xsltSource);
                        transformer.transform(xmlSource, result);
                        return writer.toString();
                    }
                }  
             

No Spring Framework 6.0, o código do controlador permanece inalterado, mas são necessárias etapas adicionais de configuração para são necessárias para garantir que ele funcione corretamente. Você pode se registrar SourceHttpMessageConverter manualmente em Configuration código. A seguir, um exemplo desse caso de uso:

            @Configuration
            public class WebConfig implements WebMvcConfigurer{
                @Override
                public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                    converters.add(new SourceHttpMessageConverter<>());
                }
            }
            

Como alternativa, você pode configurar o SourceHttpMessageConverter em um RestTemplate se você o estiver usando para recuperar XML de serviços externos. Aqui está um exemplo desse caso de uso:

            @Bean
            public RestTemplate restTemplate() {
                RestTemplate restTemplate = new RestTemplate();
                restTemplate.getMessageConverters().add(new SourceHttpMessageConverter<>());
                return restTemplate;
            }       
            

Para obter informações adicionais, consulte os recursos a seguir: