2015-09-04 43 views
1

我下面就如何使用Eclipse链接莫西到我的XML节点转换成我的模型类this official example,所以我有下面的Java代码:放置位置jaxb.properties当我的POJO是分散在许多不同的包

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目录/主/资源)作为我的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?

回答

1

如果您正在使用

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 /资源,不低于的src/main/java的

我看到,在您的代码中,您只将一个类传递给JAXBContext构造函数。你必须通过你的所有课程。另外,您也可以使用基于包的JAXBContext构造和那里穿过你的包是这样的:

JAXBContext.newInstance("pkg1:pkg2"); 

再次,jaxb.properties必须处于的pkg1pkg2的

+1

我意识到这一点,但我有几百子包,我确定我要处理动态其中JAXB类,所以我不得不把一个jaxb.properties文件下的每个子包的。但这似乎不是一件非常聪明的事情。 我发现,如果我创建共同包下一个空的类,ieab,例如Dummy.java,我传递类一起到newInstance()方法,它作为一个工作四处找jaxb.properties在/ SRC /主/资源/ A/b。 –

1

我想出了一个解决这个问题的方法。如果您创建一个空的类,在我的情况,例如,a.b.Dummy,你传递类一起到newInstance()方法,像这样:

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

莫西也将寻找jaxb.properties文件在/src/main/resources/a/b里面,所以你只需要在那里放置那个文件。或者任何与你的Dummy类包相匹配的地方。举例来说,如果你的虚拟类是my.company.app.model下,然后将jaxb.properties/src/main/resources/my/company/app/model下。

相关问题