2015-09-04 46 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下。

相關問題