更新
MOXy 中有一个错误(参见:http : //bugs.eclipse.org/412417),它会阻止在诸如 GlassFish 等 OSGi 环境中调用 marshal/unmarshal 方法。这现在已在 EclipseLink 2.3.3、2.4.3、2.5.1 和 2.6.0 流中得到修复。从2013 年 7 月 10 日开始,您可以从以下链接下载每晚构建:
我无法重现同一事件被调用两次的问题。如果您有演示此问题的代码示例,请通过我的博客与我进行电子邮件对话:
XML 绑定
如果您看到该beforeMarshal
方法被调用两次而不是一次,那么您使用的是参考实现而不是EclipseLink MOXy作为您的JAXB (JSR-222)提供程序。
演示代码
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foobar.class);
System.out.println(jc.getClass());
Foobar foobar = new Foobar();
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(foobar, System.out);
}
}
输出 - JAXB 参考实现
class com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl
beforeMarshal fired
beforeMarshal fired
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foobar/>
输出 - EclipseLink MOXy
class org.eclipse.persistence.jaxb.JAXBContext
beforeMarshal fired
<?xml version="1.0" encoding="UTF-8"?>
<foobar/>
要启用 MOXy 作为您的 JAXB 提供程序,您需要包含一个jaxb.properties
在与域模型相同的包中调用的文件,其中包含以下条目(请参阅:http ://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as -your.html )。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
JSON 绑定
MOXy 对 XML 和 JSON 绑定使用相同的管道。这意味着您将看到两者的相同事件行为。如果您没有看到事件,那么是 MOXy 以外的 JSON 绑定提供程序。