Die Klasse SourceHttpMessageConverter ist standardmäßig nicht registriert

Diese Regel kennzeichnet die Verwendung der javax.xml.transform.Source schnittstelle, wenn die SourceHttpMessageConverter klasse ist nicht gefunden. In Spring Rahmenwerk 6.0, die SourceHttpMessageConverter klasse ist nicht nicht mehr standardmäßig in Spring MVC registriert oder RestTemplate.

Infolgedessen werden Spring Webanwendungen mit javax.xml.transform.Source müssen nun konfigurieren SourceHttpMessageConverter ausdrücklich. Es ist zu beachten, dass die Reihenfolge der Konverterregistrierung wichtig ist. Beispiel: SourceHttpMessageConverter sollte vor "catch-all"-Konvertern wie MappingJackson2HttpMessageConverter.

Der folgende Codeschnipsel zeigt die Verwendung von 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 bleibt der Code des Controllers unverändert, aber es sind zusätzliche Konfigurationsschritte erforderlich, um die korrekte Funktion sicherzustellen. Sie können sich registrieren SourceHttpMessageConverter manuell in Configuration code. Im Folgenden finden Sie ein Beispiel für diesen Anwendungsfall:

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

Alternativ dazu können Sie die SourceHttpMessageConverter innerhalb einer RestTemplate wenn Sie es verwenden, um xML von externen Diensten abzurufen. Hier ist ein Beispiel für einen solchen Anwendungsfall:

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

Weitere Informationen finden Sie in den folgenden Quellen: