xml - 如何在 Spring Boot 2 中使用内容协商建立自定义 xml 序列化
问题描述
我正在重构一个 REST-API 并希望向它添加内容协商。到目前为止有效。现在我尝试为所有请求添加自定义 xml 序列化程序。但它没有或没有正确调用。
问题是,我无权访问Catalog.class
需要在导入时进行序列化的 Class ( )。因此我需要一个外部解决方案。注释类不起作用。
我尝试使用ObjectMapper
. 但这并没有直接帮助我。目标是让 spring boot 在发送响应时自动使用我的 xml 解析器。
我已经尝试了以下方法:
创建了一个 XmlMapper
@Bean
public XmlMapper getXmlMapper() {
XmlMapper mapper = new XmlMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Catalog.class, new CatalogV2Resource.Serializer());
mapper.registerModule(module);
mapper.findAndRegisterModules();
mapper.setSerializerProvider(new DefaultSerializerProvider.Impl());
return mapper;
}
尝试使用 RestTemplate 将其添加为默认值
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJackson2XmlHttpMessageConverter) {
MappingJackson2XmlHttpMessageConverter jsonConverter = (MappingJackson2XmlHttpMessageConverter) converter;
jsonConverter.setObjectMapper(xmlMapper);
}
}
return restTemplate;
}
这是我的序列化器
public static class Serializer extends StdSerializer<com.allianz.kb.Catalog> {
@Override
public void serialize(Catalog catalog, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (jsonGenerator instanceof ToXmlGenerator) {
jsonGenerator.writeRaw(new KbParser().toXML(catalog)); //use my own parser
}
}
}
和一个简化版的控制器。
@PostMapping(value = "/newcatalog", produces = {MediaType.APPLICATION_XML_VALUE, MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<Catalog> doPostXML(@RequestParam String name) {
//removed the stuff here for simplicity reasons
Catalog catalog = nc.getNewCatalog();
return ResponseEntity.ok(catalog);
}
我希望,只要收到带有“接受应用程序/xml”的请求,就会自动调用我的解析器。所以我的 XML 解析器被调用来处理 XML 请求,而标准 JSON 解析器被调用来处理 JSON 请求。
对此的任何帮助都将受到高度赞赏。提前非常感谢!
解决方案
对于自动 XML 序列化和反序列化,您需要注册MappingJackson2XmlHttpMessageConverter
如下类型的 bean -
@Bean("mappingJackson2XmlHttpMessageConverter")
public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter()
{
return new MappingJackson2XmlHttpMessageConverter(new XmlMapper());
}
推荐阅读
- php - SQLlite 值到结果数组中
- javascript - 如何从公共文件夹访问 .env 变量 - reactjs
- python - 获取 Maya 命令的参数标志和默认值
- python - 如何通过xlwings删除excel中的特定行?
- javascript - 球从地板上弹起
- python - 应该使用哪个合并,以便所有列都显示 Pandas 所需的数据?
- java - Flink - 将 Avro 数据流转换为表
- r - 如何在 R 中更改我的表的设计
- python - 如果语句python中的curse.execute
- discord.js - 不和谐.js | 添加音乐命令时清除命令中断