我跟随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?
答案 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
下。