2015-10-29 40 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属性非常简单和简化。有没有人有更好的答案?

相关问题