我有一个从MOXy的XJC版本生成的JAXB模型。绑定的文件中使用了xjc:superclass标记,因此所有对象都扩展了一个公共类。
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,以及模型中的一些其他类,这样我就可以从基类自定义它的方法行为。因此,我扩展了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);我遇到的问题是MOXy似乎随机决定是调用CustomObjectFactory的方法还是调用ObjectFactory的方法。
在CustomObjectFactory类中,如果我只有一个被覆盖的方法,那么这个方法总是被调用的。但是,当我放入更多内容时,MOXy似乎随机决定是否调用ObjectFactory的方法或CustomObjectFactory的方法。
当我对Oracle的JAXB实现使用与JDK提供的相同类型的设置时,它工作得很好。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());我试图在MOXy解组程序上设置ObjectFactory属性,但它抛出了一个异常。
发布于 2015-10-30 02:54:48
我找到了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;
}
}这似乎是可行的,但它很古怪,而且容易出现程序员错误,因为必须编辑多个源文件才能获得所需的功能。Oracle在反编组程序上的ObjectFactory属性非常简单和简化。谁有更好的答案?
https://stackoverflow.com/questions/33417272
复制相似问题