Ant*_*ink 5 java xml-serialization jackson
我有以下java对象
class MyXmlObject{
@JsonProperty
private InnerObject innerObject;
@JsonProperty
private String someOtherProperty;
}
Run Code Online (Sandbox Code Playgroud)
当我使用序列化时
public String getXmlObjectAsXML(MyXmlObject myXmlObject){
JacksonXmlModule module = new JacksonXmlModule();
module.setDefaultUseWrapper(false);
XmlMapper mapper = new XmlMapper(module);
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
String response = "";
response = mapper.writeValueAsString(myXmlObject);
return response;
}
Run Code Online (Sandbox Code Playgroud)
我希望InnerObject类包装在CDATA标记中.
处理此方案的正确方法是什么?
有@JacksonXmlCData自2.5.https://github.com/FasterXML/jackson-dataformat-xml:
@JacksonXmlCData允许指定要在CData标记内序列化属性的值.
我们有一个类似的用例。我们需要将XML 中的所有文本字段封装在 CDATA 中。这是我们需要实现的 API 的要求,但我们对 API 没有发言权。
为了解决这个问题,我们创建了 @StaxMan 建议的实现,以覆盖 XMLOutputFactory 和 XMLStreamWriter 来劫持writeCharacters()和调用writeCData(),这似乎效果很好。您可以在此处查看我们确切代码的要点(已更改包名称):
https://gist.github.com/jbcpollak/8312151
简而言之,我们创建了一个CDataXmlOutputFactoryImpl类,该类创建了一个CDataXmlStreamWriter. 不幸的是,我们需要包装目标类,而不是使用继承,因为它们都是最终的。此外,要使用的确切编写器是可变的,因此包装是一个更安全的选择。
在工厂中,除了使用纯传递函数包装所有其他方法之外,您还需要为每个 createXMLStreamWriter() 函数(有 4 个)进行类似的操作:
public XMLStreamWriter createXMLStreamWriter(Writer w)
throws XMLStreamException
{
return new CDataXmlStreamWriter(f.createXMLStreamWriter(w));
}
Run Code Online (Sandbox Code Playgroud)
其中f是OutputFactoryImpl类中构造的。
除以下两个方法外,所有CDataXmlStreamWriter必要的函数都是 w 中方法的纯委托:
public void writeCharacters(char[] text, int start, int len)
throws XMLStreamException
{
w.writeCharacters(text, start, len);
}
// All this code just to override this method
public void writeCharacters(String text) throws XMLStreamException
{
w.writeCData(text);
}
Run Code Online (Sandbox Code Playgroud)
这就是您需要做的全部事情。只需像这样使用你的新工厂:
public void init() {
XmlFactory factory = new XmlFactory(new InputFactoryImpl(),
new CDataXmlOutputFactoryImpl());
xmlMapper = new XmlMapper(factory);
xmlMapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
}
Run Code Online (Sandbox Code Playgroud)
完整的代码可以在上面的Gist中看到。
如果您只需要 CDATA 中包含的几个字段,我不确定此解决方案是否有效。为此,我认为您需要修改 ToXmlGenerator,使其以某种方式了解您的模型(也许使用注释?),然后生成器将writeCData()在必要时调用。
| 归档时间: |
|
| 查看次数: |
5522 次 |
| 最近记录: |