Jaxb after/before(Un)封送处理事件激发两次,并且仅适用于xml

Jaxb after/before(Un)封送处理事件激发两次,并且仅适用于xml,jaxb,eclipselink,jax-rs,glassfish-3,moxy,Jaxb,Eclipselink,Jax Rs,Glassfish 3,Moxy,一个简单类,正在编组以进行输出: @XmlRootElement public class Foobar { // ... void beforeMarshal(Marshaller m) { System.out.println("beforeMarshal fired"); } } JAX-RS也非常简单: @GET public Response getResponse() { Foobar fb = new Foobar();

一个简单类,正在编组以进行输出:

@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 fired”一次,但会激发两次?
这正常吗?我认为使用额外的旗帜不是一个好主意

@XmlTransient
private boolean marshalled;

void beforeMarshal(Marshaller m) {
    if (!this.marshalled) {
        System.out.println("beforeMarshal");
        this.marshalled = true;
    }
}

另外,在查询json输出的资源时,它根本不会触发封送事件。

更新

MOXy中有一个bug(请参阅:)会阻止在GlassFish等OSGi环境中调用封送/解封送方法。这一点现在在EclipseLink 2.3.3、2.4.3、2.5.1和2.6.0流中固定。从2013年7月10日开始,您可以从以下链接下载夜间版本:

我无法再现同一事件被称为两次的问题。如果您有演示此问题的代码示例,请通过我的博客与我进行电子邮件对话:


XML绑定

如果您看到调用
beforemashall
方法两次而不是一次,那么您使用的是引用实现,而不是提供程序

演示代码

import javax.xml.bind.*;
公开课演示{
公共静态void main(字符串[]args)引发异常{
JAXBContext jc=JAXBContext.newInstance(Foobar.class);
System.out.println(jc.getClass());
Foobar Foobar=新Foobar();
Marshaller=jc.createMarshaller();
marshaller.marshall(foobar,System.out);
}
}
输出-JAXB参考实现

JSON绑定

MOXy对XML和JSON绑定使用相同的管道。这意味着您将看到两者的相同事件行为。如果看不到事件,则使用除MOXy之外的JSON绑定提供程序


我在web.xml中有
jaxb.properties
文件集和自定义应用程序
rest.MyApplication
。因此,我认为MOXy是我的JAXB提供程序。@命令式-在
beforeMarahal
方法中传递给您的
Marshaller
的实现类是什么?如果它是
org.eclipse.persistence.jaxb.JAXBMarshaller
,那么您使用的是
MOXy
。它是
org.eclipse.persistence.jaxb.JAXBMarshaller
。我的目标是在处理JAX-RS服务器上的对象时调用事件。您的演示运行得很好,但是有可能将这种机制用于JAX-RS吗?我问这个问题,因为我找不到这方面的任何样品。@commissive-我接下来几天就要离开了。星期二第一件事我就要开始了。
class com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl
beforeMarshal fired
beforeMarshal fired
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foobar/>
class org.eclipse.persistence.jaxb.JAXBContext
beforeMarshal fired
<?xml version="1.0" encoding="UTF-8"?>
<foobar/>
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory