我有一个从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的属性,但它引发了异常。