java - JAXB MOXy 中的静态工厂方法

标签 java xml jaxb eclipselink moxy

我正在定义一个静态工厂方法:

@XmlType(factoryClass=DummyFactory.class, factoryMethod="createNew")
public abstract MyClass() {
}

我使用工厂方法的原因是MyClass是抽象的,如何获取它的实例取决于类的某些注释。此逻辑嵌入在工厂方法 createNew 中。

此外,工厂类DummyFactory是抽象的。据我了解,如果工厂类的工厂方法是静态的( http://download.oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlType.html ),则工厂类不需要提供默认构造函数。

这是工厂类的原始简化:

public abstract class DummyFactory {
    public static MyClass createNew() {
        // code for returning a new instance of MyClass
    }   
}

但是,当我尝试解码 XML 文档时,出现以下异常:

Exception [EclipseLink-171] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: The factory class does not define a public default constructor, or the constructor raised an exception.
Internal Exception: java.lang.InstantiationException

首先,我认为我在工厂类和方法的解释中没有得到正确的信息,但后来我尝试使用 JAXB RI,并且效果很好。 所以我的问题是:

有没有办法让 MOXy 与抽象工厂类一起工作?

(JAXB RI 给我带来了其他类型的问题,这就是我不想使用它的原因)。

最佳答案

感谢您为此问题输入错误 ( https://bugs.eclipse.org/362984 )。该问题已在 EclipseLink 2.4 流中得到修复,并将于今天(2011 年 11 月 9 日)向后移植到 EclipseLink 2.3.2 流中。您可以尝试从以下位置获取每晚下载的修复:

现在,如果您使用 @XmlType 注释指定工厂类,例如:

@XmlType(factoryClass=DummyFactory.class, factoryMethod="createNew")
public abstract MyClass() {
}

支持以下类型的工厂类:

具有静态方法的工厂

通过此错误修复,当 MOXy 使用工厂方法创建 MyClass 实例时,不会创建 DummyFactory 实例。

public abstract class DummyFactory {
    public static MyClass createNew() {
        // code for returning a new instance of MyClass
    }   
}

带有实例方法的工厂

除了静态方法之外,MOXy 还允许您指定实例级创建方法。对于这些方法,MOXy 将创建工厂类的实例。

public class DummyFactory {
    public MyClass createNew() {
        // code for returning a new instance of MyClass
    }   
}

JAXB RI 中不允许此配置,您将收到以下异常:

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Factory class "forum8022136.DummyFactory" does not have static zero args factory method "createNew".
    this problem is related to the following location:
        at forum8022136.MyClass

    at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:436)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143)
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:376)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
    at forum8022136.Demo.main(Demo.java:14)

关于java - JAXB MOXy 中的静态工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022136/

相关文章:

java - 套接字 : cannot read from BufferedReader and/or write to PrintWriter in certain conditions

asp.net - 替换过时的 System.Xml.XmlDataDocument?

java - 如何在 Android 偏好设置中使用 DatePicker

java - 如何控制生成的 JAXB 枚举

java - 无法解码 SOAP 错误

java - 使用 Java 的 SOAP Web 服务 - 框架?

java - 如果在运行时添加子组件,如何调整面板大小?

Java 11 : import javax. xml.ws.WebFault: "Cannot resolve symbol ws"

java - 在 RealmObject 外部创建托管 RealmList

xml - 使用 PowerShell 将 system.xml.xml 元素转换为 system.xml.xml 文档