当我的pojos遍布许多不同的包时,在哪里放置jaxb.properties

时间:2015-09-04 14:55:23

标签: java properties jaxb eclipselink moxy

我跟随this official example关于如何使用Eclipse Link Moxy将我的XML节点转换为我的模型类,所以我有以下java代码:

    byte[] bytes = getBytesIn("AW33.xml");
    Element rootnode = ConversionTool.byteArrayToDOMElement(bytes);

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    String bindingsFileName = ConversionTool.getBindingsFileName(rootnode);
    InputStream iStream = classLoader.getResourceAsStream("conversion/bindings/" + bindingsFileName);

    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, iStream);

    Class<?> messageClass = ConversionTool.getMessageClass(rootnode);

    JAXBContext ctx = JAXBContext.newInstance(new Class[]{messageClass}, properties);

与许多其他开发人员一样,我遇到了麻烦,你必须创建一个jaxb.properties文件来支持属性eclipselink.oxm.metadata-source

如果我将此文件放在完全相同的包中(但在/ src / main / resources下),我的messageClass就可以了,否则我会得到众所周知的错误:

javax.xml.bind.JAXBException: property "eclipselink.oxm.metadata-source" is not supported

问题是我的模型类分布在包的层次结构上,例如:

a.b.c1
a.b.c2
a.b.c3

如果我将它放在最远的公共包裹中,即a.b它不起作用。

那么我在哪里放置这个文件呢?

或者在这种情况下是否有更好的方法来创建JAXBContext?

2 个答案:

答案 0 :(得分:2)

如果您正在使用

public static JAXBContext newInstance( Class[] classesToBeBound, Map<String,?> properties )

构造。 jaxb.properties 必须放在模型类所在的其中一个包中。

例如,在这种情况下

JAXBContext.newInstance(pkg1.Class1.class, pkg2.Class2.class);

您可以将 jabx.properties 放在 pkg1 包或 pkg2 包中。

如果您使用Maven,则必须将其置于 src / main / resources 下,而不是 src / main / java 下。

我在你的代码中看到你只将一个类传递给JAXBContext构造函数。你必须把你所有的课程都传递给那里。或者,您可以使用基于包的JAXBContext构造函数并将包传递到那里:

JAXBContext.newInstance("pkg1:pkg2");

同样, jaxb.properties 必须位于 pkg1 pkg2

答案 1 :(得分:1)

我想到了解决这个问题的方法。如果你创建一个空类,例如我的a.b.Dummy,你将该类传递给newInstance()方法,如下所示:

JAXBContext ctx = JAXBContext.newInstance(new Class[]{messageClass, Dummy.class}, properties);

MOXy还会在/src/main/resources/a/b中查找 jaxb.properties 文件,因此您只需将该文件放在那里。或者任何与您的Dummy类套餐相匹配的地方。例如,如果您的虚拟类位于my.company.app.model下,则将 jaxb.properties 放在/src/main/resources/my/company/app/model下。