La clase SourceHttpMessageConverter no está registrada por defecto

Esta regla marca el uso de javax.xml.transform.Source cuando el SourceHttpMessageConverter clase es no encontrada. En Spring Framework 6.0, el SourceHttpMessageConverter clase es no registrada por defecto en Spring MVC o RestTemplate.

En consecuencia, las aplicaciones web Spring que utilizan javax.xml.transform.Source ahora necesita configurar SourceHttpMessageConverter explícitamente. Es importante señalar que el orden de registro de los convertidores es importante. Por ejemplo: SourceHttpMessageConverter debería antes que convertidores "comodín" como MappingJackson2HttpMessageConverter.

El siguiente fragmento de código muestra el 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();
                    }
                }  
             

En Spring Framework 6.0, el código del controlador permanece inalterado, pero se requieren pasos adicionales de configuración para garantizar su correcto funcionamiento. Puede registrarse SourceHttpMessageConverter manualmente en Configuration código. A continuación se presenta un ejemplo de este caso de uso:

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

Como alternativa, puede configurar el SourceHttpMessageConverter dentro de un RestTemplate si lo utiliza para recuperar XML de servicios externos. He aquí un ejemplo de este caso de uso:

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

Para obtener más información, consulte los recursos siguientes: