Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向使用JAXB解析XML时创建的对象注入运行时数据_Java_Xml_Jaxb - Fatal编程技术网

Java 如何向使用JAXB解析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

我必须解析一个复杂的XML文档。我的模型中的一些类实现接口
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()