【问题标题】:Specifying the MOXy runtime for multiple Java packages为多个 Java 包指定 MOXy 运行时
【发布时间】:2011-05-02 21:53:38
【问题描述】:

除了将jaxb.properties 放入每个单独的包之外,对于分布在多个 Java 包中的域类,有没有办法将 MOXy 指定为我的 JAXB 实现?

【问题讨论】:

    标签: java jaxb eclipselink moxy


    【解决方案1】:

    要将EclipseLink MOXy 指定为 JAXB 提供者,您需要将 jaxb.properties 放入域对象的其中一个包中,即 传入 以引导 JAXBContext。例如,如果您的 JAXBContext 将基于以下 2 个类:

    • example.foo.Foo
    • example.bar.Bar

    example.foo.Foo

    package example.foo;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    
    import example.bar.Bar;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Foo {
    
        private Bar bar;
    
    }
    

    example.bar.Bar

    package example.bar;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    
    import example.foo.Foo;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Bar {
    
        private Foo foo;
    
    }
    

    example/foo/jaxb.properties

    为了指定应该使用 JAXB 的 MOXy 实现,我们将在与 Foo 类相同的包中放置一个包含以下条目的 jaxb.properties 文件。

    javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    

    演示

    由于 Foo 和 Bar 类相互引用,最终 JAXBContext 将包含有关它们的元数据,但根据我们创建 JAXBContext 的方式,提供者可能会有所不同。

    package example;
    
    import javax.xml.bind.JAXBContext;
    import example.foo.Foo;
    import example.bar.Bar;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception{
            System.out.println(JAXBContext.newInstance(Foo.class).getClass());
            System.out.println(JAXBContext.newInstance(Bar.class).getClass());
            System.out.println(JAXBContext.newInstance(Foo.class, Bar.class).getClass());
        }
    
    }
    

    运行上面的代码会产生:

    class org.eclipse.persistence.jaxb.JAXBContext
    class com.sun.xml.bind.v2.runtime.JAXBContextImpl
    class org.eclipse.persistence.jaxb.JAXBContext
    

    【讨论】:

    • 仅将jaxb.properties 添加到一个包中似乎只会影响该特定包中的类。
    • 你是如何引导 JAXBContext 的?
    • 为了验证这一点,我的测试只是打印了JAXBContext.newInstance(Foo.class).getClass().getName() 的两个不同Foo.class 值的结果;一个在包含jaxb.properties 的包中,一个在不包含该文件的包中。无论如何,这个问题比我知道你现在正在处理的另一个问题要少。在更大的问题得到解决之前,我将暂时提出这个问题。谢谢你的帮助,顺便说一句!
    • @Matt Ball - 没问题,我已经用一个示例更新了我的答案,该示例演示了如何根据 jaxb.properties 文件选择 JAXB 提供程序。
    • 好的,这对我来说已经足够了。我不确定 Jersey 是如何引导它的 JAXBContext 的,但我能够从 7 个(以及不断增加的)包中除 2 个之外的所有包中删除 jaxb.properties。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2020-09-21
    • 2019-01-01
    • 2012-08-30
    • 2012-01-15
    相关资源
    最近更新 更多