Это правило запрещает использование
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;
}
Дополнительная информация: