Java 如何向使用JAXB解析XML时创建的对象注入运行时数据
我必须解析一个复杂的XML文档。我的模型中的一些类实现接口Java 如何向使用JAXB解析XML时创建的对象注入运行时数据,java,xml,jaxb,Java,Xml,Jaxb,我必须解析一个复杂的XML文档。我的模型中的一些类实现接口HasDate: interface HasDate { public void setDate(Date date); } 创建解组器的日期已知: // here I know the date. JAXBContext ctx = JAXBContext.newInstance("com.mycompany.mymodel"); Unmarshaller unmarshaller = ctx.createUnmarshall
HasDate
:
interface HasDate {
public void setDate(Date date);
}
创建解组器的日期已知:
// here I know the date.
JAXBContext ctx = JAXBContext.newInstance("com.mycompany.mymodel");
Unmarshaller unmarshaller = ctx.createUnmarshaller();
unmarshaller.unmarshal(input);
我想在JAXB解析文档时,为实现HasDate
的类的每个实例调用setDate()
以下是我了解的两个解决方案:
我可以如下注释每个相关类:
@XmlType(factoryClass = ObjectFactory.class, factoryMethod = "createMyObject")
方法createMyObject()
将调用setDate()
。此解决方案的问题是createMyObject()
必须是静态的。将信息设置为静态成员会使解决方案不具有线程安全性
作为此解决方案的一种变体,我可以在解析之前将日期设置为ThreadLocal
CreateMObject()
将从ThreadLocal
读取日期,并调用setDate()
。此解决方案是线程安全的,但看起来像一个补丁
另一种解决方案是发现JAXB使用反射创建的对象图,递归遍历它,并在需要时调用setDate()。此解决方案是线程安全的,但需要一些实现工作,并且需要在将来进行维护
我想知道JAXB是否有其他解决这个问题的内置解决方案 我建议对实现HasDate
接口的所有类使用@XmlAdapter
。这使您的用例显式且类型安全。您可以有一个基本适配器,它能够从ThreadLocal查找日期
如果此选项不起作用,那么我喜欢在生命周期方法中调用反射方法。您可以实现解组器.Listener
并将其设置在解组器上。然后在afterUnmarshal
方法上,如果目标类是HasDate
的实例,则可以对其调用setDate
方法
谢谢您的回答。我读了你发给我的文章,更喜欢使用listener.afterUnmarshal()