亦余心之所善兮,虽九死其犹未悔。这篇文章主要讲述是否可以让Jackson ObjectMapper在Spring Boot应用程序中遵守JAXB XML注释?相关的知识,希望能为你提供帮助。
使用spring-boot jackson进行ObjectMapper
应用程序我使用以下模式将List
字段序列化得很好:
@JacksonXmlProperty(localName = "item")
@JacksonXmlElementWrapper(useWrapping = true, localName = "items")
private List<
Item>
items;
所以得到类似的东西:
<
items>
<
item>
...<
/item>
<
item>
...<
/item>
...
<
/items>
【是否可以让Jackson ObjectMapper在Spring Boot应用程序中遵守JAXB XML注释()】我已经研究过 - 没有任何运气 - 如何使用像jaxb这样的
@XmlElementWrapper
注释来实现这一目标。有没有 - 例如 - 我可以用
JacksonConfiguration
做些什么?UPDATE
添加
objectMapper.registerModule(new JaxbAnnotationModule());
到Spring Jackson配置和注释如:
@XmlElementWrapper
@XmlElement(name="item")
private List<
Item>
items;
没有按预期工作。我目前正在研究用this post在GSON取代杰克逊的可能性
我真的希望这个注释的东西是通用的,所以不仅仅是jackson特定的,或者像每个序列化器实现添加注释一样。
答案我没有尝试过jackson-dataformat-xml / JaxbAnnotationModule,我不确定它是否与spring-boot兼容(如果是的话你应该回复),但值得测试一下。
更新:
在这里你是一个测试(使用上面的链接)
import java.io.IOException;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule;
public class TestJacksonWithJaxbAnnot {static ObjectMapper objectMapper = new ObjectMapper();
static{
objectMapper.registerModule(new JaxbAnnotationModule());
}@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "item")
static class Item {
@XmlElement
int id;
@XmlElement
String name;
//getters, setters, etc.
}@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "itemcollection")
static class ItemCollection {
@XmlElement
String nameOfItems;
@XmlElement
List<
Item>
items;
//getters, setters, etc.
}public static void main(String[] args) throws XMLStreamException, IOException {
ItemCollection testColl = new ItemCollection();
testColl.nameOfItems = "Test items";
Item item1 = new Item();
item1.id = 1;
item1.name = "apple";
Item item2 = new Item();
item2.id = 2;
item2.name = "orange";
testColl.items = Arrays.asList(item1, item2);
StringWriter stringWriter = new StringWriter();
XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance();
XMLStreamWriter sw =xmlOutputFactory.createXMLStreamWriter(stringWriter);
XmlMapper mapper = new XmlMapper();
sw.writeStartDocument();
sw.writeStartElement("root");
mapper.writeValue(sw, testColl);
sw.writeComment("Some insightful commentary here");
sw.writeEndElement();
sw.writeEndDocument();
System.out.println(stringWriter.toString());
}
}
输出:
<
?xml version="1.0" encoding="UTF-8"?>
<
root>
<
ItemCollection>
<
nameOfItems>
Test items<
/nameOfItems>
<
items>
<
items>
<
id>
1<
/id>
<
name>
apple<
/name>
<
/items>
<
items>
<
id>
2<
/id>
<
name>
orange<
/name>
<
/items>
<
/items>
<
/ItemCollection>
<
!--Some insightful commentary here-->
<
/root>
如你所见,它并不完美,例如它没有处理@XmlRootElement注释中定义的名称。 (在我的1.5.10.RELEASE spring-boot项目中测试过,其中jackson-dataformat-xml具有2.8.10托管版本)。
也许在以后的版本中你会得到更好的输出。
推荐阅读
- Android从主活动类中的非类布局访问Textview
- 您可以将视频从Android流式传输到Google云端硬盘吗( [关闭])
- 不推荐使用Drive.DriveApi.getAppFolder(mGoogleApiClient)
- 我无法使用我的Android使用IPv4访问我的笔记本
- 如何制作Android自定义键盘()
- 在Angular App中的Obseable POST请求中使用switchMap
- 什么是app(overlayImage in xmlns:app =“http://schemas.android.com/apk/res-auto())
- 点击劫持攻击(提防社交网络识别)
- 如何将你的站点添加到安全浏览工具以建立信任关系()