Класс SourceHttpMessageConverter не зарегистрирован по умолчанию

Это правило запрещает использование javax.xml.transform.Source интерфейс, когда SourceHttpMessageConverter класс не не найден. В Spring Framework 6.0, в SourceHttpMessageConverter класс не больше не регистрируется по умолчанию в Spring MVC или RestTemplate.

Как следствие, веб-приложения Spring, использующие javax.xml.transform.Source теперь нужно настраивать SourceHttpMessageConverter явно. Важно отметить, что порядок регистрации конвертера имеет значение. Например, SourceHttpMessageConverter следует ли должны быть зарегистрированы раньше, чем "универсальные" конвертеры, такие как MappingJackson2HttpMessageConverter.

Следующий фрагмент кода показывает использование 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();
                    }
                }  
             

В Spring Framework 6.0 код контроллера остается неизменным, но требуются дополнительные шаги по настройке чтобы обеспечить его правильное функционирование. Вы можете зарегистрироваться SourceHttpMessageConverter вручную в Configuration код. Ниже приведен пример такого варианта использования:

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

В качестве альтернативы можно настроить SourceHttpMessageConverter в пределах RestTemplate если вы используете его для получения XML из внешних служб. Вот пример такого варианта использования:

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

Дополнительная информация: