gpt4 book ai didi

java - 未使用 EclipseLink Moxy 的 Binder 实现调用 JAXB 解码回调

转载 作者:行者123 更新时间:2023-12-01 04:13:33 26 4
gpt4 key购买 nike

我对javax.xml.bind.Binder implementation of EclipseLink Moxy有疑问:unmarshal callback methods当我从 DOM 文档实例中解码对象时,(在我的例子中是 afterUnmarshal )在我的绑定(bind)类中注释的永远不会被调用。

问题似乎出在 org.eclipse.persistence.oxm.XMLUnmarshaller Binder 使用的实例:负责调用回调方法的 unmarshalListener 始终为 null。此代码演示了问题:

//Instantiate a JAXBContext
JAXBContext context = JAXBContext.newInstance(MyObject.class);

//Create a "standard" unmarshaller
JAXBUnmarshaller standardUnmarshaller = (JAXBUnmarshaller) context.createUnmarshaller();

//assertion is ok
assert standardUnmarshaller.getXMLUnmarshaller().getUnmarshalListener() != null;

//Create a Binder
XMLBinder xmlBinder = ((JAXBBinder) context.createBinder()).getXMLBinder();

//Use reflection tricks to get the unmarshaller (fest-reflect is used for conciseness)
XMLUnmarshaller binderUnmarshaller = Reflection.field("unmarshaller").ofType(XMLUnmarshaller.class).in(xmlBinder).get();

//assertion error here
assert binderUnmarshaller.getUnmarshalListener() != null;

这个问题不容易修复,因为org.eclipse.persistence.jaxb.JAXBUnmarshalListener如果没有 javax.xml.bind.Unmarshaller 实例,则无法实例化,该实例在 Binder 上下文中不存在。 Moxy 中没有其他可用的 XMLUnmarshalListener 实现来替代 JAXBUnmarshalListener。

我想出了这个解决方法,其中包括重用“标准”JAXB 解码器中的 JAXBUnmarshalListener 实例。 :

//Instantiate a JAXBContext
JAXBContext context = JAXBContext.newInstance(MyObject.class);

//Create a Binder
JAXBBinder binder = (JAXBBinder) context.createBinder();

//Create an standard unmarshaller to reuse its unmarshalListener
JAXBUnmarshaller standardUnmarshaller = (JAXBUnmarshaller) context.createUnmarshaller();

//Use reflection for setting the binder's unmarshallerListener (fest-reflect again)
XMLUnmarshaller unmarshaller = Reflection.field("unmarshaller").ofType(XMLUnmarshaller.class).in(binder.getXMLBinder()).get();
unmarshaller.setUnmarshalListener(standardUnmarshaller.getXMLUnmarshaller().getUnmarshalListener());

//my unmarshal callbacks are called now
MyObject myObject = binder.unmarshal(domDocument);

我猜问题与编码(marshal)方法相同,但我没有调查这种情况,因为我不使用编码(marshal)回调。

我测试了 javax.xml.bind.Binder 的 JAXB RI 实现,并且回调方法被正确调用。不过,我不建议使用 RI,因为它不会保留原始 DOM 文档中的注释节点。

我是否遗漏了 Moxy 配置中的某些内容,或者这是实现中的错误?如果出现错误,是否有比我使用的更简单的解决方法?

最佳答案

我已经能够确认您所看到的问题。您可以使用以下链接跟踪我们在此问题上的进展:

关于java - 未使用 EclipseLink Moxy 的 Binder 实现调用 JAXB 解码回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19653825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com