2015-10-29 38 views
0

我有一個從MOXy版本的XJC生成的JAXB模型。 xjc:superclass標記用於綁定的文件中,因此所有對象都擴展了一個公共類。在EclipseLink中擴展ObjectFactory MOXy

package my.package 
//Base.java 
@XmlTransient 
public class Base { 
    //... 
} 

//MyTag.java (generated from XJC) 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = {/*...*/}) 
@XmlRootElement(name = "myTag") 
public class MyTag extends Base { 
    //... 
} 

模型和模式都可以更改,但我可以更改基類。

我需要擴展MyTag以及模型中的其他類,所以我可以從Base類自定義它的方法行爲。所以我擴展了MyTag和需要自定義行爲的其他域類以及ObjectFactory。這些類存在於獨立的Java包中。

package my.extended.package 
//MyTagExtended.java 
public class MyTagExtended extends MyTag { 
    //... 
} 

//CustomObjectFactory.java 
public class CustomObjectFactory extends ObjectFactory { 
    //... 

    @Override 
    public MyTagExtended createMyTag() { 
     return new MyTagExtended(); 
    } 

    //... 
} 

施藥代碼:

package application 
//Application.java 
System.setProperty("org.eclipse.persistence.moxy.annotation.xml-value-extension", "true"); 
JAXBContext jc = (JAXBContext) JAXBContext.newInstance(XPSObjectFactory.class); 
JAXBUnmarshaller u = jc.createUnmarshaller(); 
return u.unmarshal(xmlFile); 

我遇到的問題是莫西似乎隨機決定是否調用CustomObjectFactory的或的ObjectFactory的方法。

在CustomObjectFactory類中,如果我只有一個重寫的方法,則始終調用該方法。然而,當我放入更多的時候,MOXy似乎隨機決定是否調用ObjectFactory的方法或CustomObjectFactory。

當我使用與JDK提供的Oracle JAXB實現相同類型的設置時,它工作正常。 CustomObjectFactory的方法總是被調用。

是否需要設置配置?我如何配置MOXy來始終使用我的CustomObjectFactory的方法?

編輯: 爲了澄清,這裏是我是如何做到與Oracle的JAXB實現相同的情況下工作:

JAXBContext jc = JAXBContext.newInstance("my.package"); 
Unmarshaller u = jc.createUnmarshaller(); 
u.setProperty("com.sun.xml.internal.bind.ObjectFactory", new CustomObjectFactory()); 

我試圖設置在莫西解組的ObjectFactory的屬性,但它引發了異常。

回答

0

我找到了MOXy的解決方法。我在XmlClassExtractor上找到了一些信息,可以用它來指定實例化哪個類。由於我無法修改域對象,因此使用了XML文件。

我不停的擴展類相同,但修改Application.java並寫了binding.xml文件和ClassExtractor:

package application 
//Application.java 
System.setProperty("org.eclipse.persistence.moxy.annotation.xml-value-extension", "true"); 
Map<String, Object> properties = new HashMap<String, Object>(); 
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, "classExtractor.xml"); 
JAXBContext jc = (JAXBContext) JAXBContextFactory.createContext(new Class[]{CustomObjectFactory.class}, properties); 
JAXBUnmarshaller u = jc.createUnmarshaller(); 
return u.unmarshal(xmlFile); 

classExtractor.xml:

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="my.package" 
    version="2.3"> 
    <java-types> 
     <java-type name="MyTag"> 
      <xml-class-extractor class="my.extended.package.MyTagClassExtractor"/> 
     </java-type> 
    </java-types> 
</xml-bindings> 

類提取:

package my.extended.package 
//MyTagExtractor.java 
public class MyTagExtractor extends ClassExtractor { 
    @Override 
    public Class<? extends Base> extractClassFromRow(Record databaseRow, Session session) { 
     return MyTagExtended.class; 
    } 
} 

這似乎工作,但它很古怪,並且由於mult必須編輯源文件才能獲得所需的功能。解組器上的Oracle的ObjectFactory屬性非常簡單和簡化。有沒有人有更好的答案?

相關問題