La classe SourceHttpMessageConverter non è registrata per impostazione predefinita

Questa regola segnala l'uso dell'opzione javax.xml.transform.Source quando l'interfaccia SourceHttpMessageConverter classe è non trovata. In Spring Framework 6.0, il SourceHttpMessageConverter classe è non è più non è più registrata per impostazione predefinita in Spring MVC o RestTemplate.

Di conseguenza, le applicazioni web di Spring che utilizzano javax.xml.transform.Source ora è necessario configurare SourceHttpMessageConverter esplicitamente. È importante notare che l'ordine di registrazione dei convertitori è importante. Ad esempio, SourceHttpMessageConverter dovrebbero dovrebbe essere registrato prima dei convertitori "catch-all" come MappingJackson2HttpMessageConverter.

Il seguente frammento di codice mostra l'uso di 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();
                    }
                }  
             

In Spring Framework 6.0, il codice del controllore rimane invariato, ma sono necessari ulteriori passaggi di configurazione per assicurarne il corretto funzionamento per assicurarne il corretto funzionamento. È possibile registrarsi SourceHttpMessageConverter manualmente in Configuration il codice. Di seguito è riportato un esempio di questo caso d'uso:

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

In alternativa, è possibile configurare l'opzione SourceHttpMessageConverter all'interno di un RestTemplate se lo si usa per recuperare XML da servizi esterni. Ecco un esempio di questo caso d'uso:

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

Per ulteriori informazioni, consultare le seguenti risorse: