一个简单的类,正在为输出编组:
@XmlRootElement
public class Foobar {
// ...
void beforeMarshal(Marshaller m) {
System.out.println("beforeMarshal fired");
}
}
JAX-RS也非常简单:
@GET
public Response getResponse() {
Foobar fb = new Foobar();
// ...
return Response.ok(fb).build();
}
预期的输出是“beforeMarshal”一次,但它会发射两次? 这是正常的吗?我不认为使用额外的旗帜是一个好主意..
@XmlTransient
private boolean marshalled;
void beforeMarshal(Marshaller m) {
if (!this.marshalled) {
System.out.println("beforeMarshal");
this.marshalled = true;
}
}
此外,在查询资源以获取json输出时,它根本不会触发marshal事件。
答案 0 :(得分:1)
<强>更新强>
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 BINDING
如果您发现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 BINDING
MOXy使用相同的管道进行XML和JSON绑定。这意味着您将看到两者的相同事件行为。如果您没有看到事件,那么除MOXy之外的JSON绑定提供程序。