之后/之前(Un)Marshal事件触发两次,仅针对xml

时间:2013-07-05 10:45:54

标签: 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();
    // ...
    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事件。

1 个答案:

答案 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绑定提供程序。