我正在使用:
定义静态工厂方法@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给了我其他类型的问题,这就是我不想使用它的原因。)
答案 0 :(得分:2)
感谢您输入此问题的错误(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)