首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在EclipseLink MOXy中扩展ObjectFactory

在EclipseLink MOXy中扩展ObjectFactory
EN

Stack Overflow用户
提问于 2015-10-29 22:40:26
回答 1查看 321关注 0票数 0

我有一个从MOXy的XJC版本生成的JAXB模型。绑定的文件中使用了xjc:superclass标记,因此所有对象都扩展了一个公共类。

代码语言:javascript
复制
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包中。

代码语言:javascript
复制
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();
    }

    //...
}

应用程序代码:

代码语言:javascript
复制
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实现中使用相同的场景:

代码语言:javascript
复制
JAXBContext jc = JAXBContext.newInstance("my.package");
Unmarshaller u = jc.createUnmarshaller();
u.setProperty("com.sun.xml.internal.bind.ObjectFactory", new CustomObjectFactory());

我试图在MOXy解组程序上设置ObjectFactory属性,但它抛出了一个异常。

EN

回答 1

Stack Overflow用户

发布于 2015-10-30 02:54:48

我找到了MOXy的变通方法。我在XmlClassExtractor上找到了一些信息,这些信息可以用来指定要实例化的类。因为我不能修改域对象,所以使用了XML文件。

我保持扩展类不变,但修改了Application.java并编写了一个binding.xml文件和一个ClassExtractor:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<?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>

类提取器:

代码语言:javascript
复制
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属性非常简单和简化。谁有更好的答案?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33417272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档