2011-11-05 100 views
1

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

@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

我是莫西领先,这似乎是一个错误。你可以为这个问题输入一个错误:https://bugs.eclipse.org/bugs/enter_bug.cgi?product = EclipseLink。我们应该能够在Moday上得到解决。 –

+0

完成。提交的问题:https://bugs.eclipse.org/bugs/show_bug.cgi?id = 362984。非常感谢您的快速回复。 – Sergio

+0

我们已经想出了修复方案,我们只需要清除测试。我希望明天我们会检查修复。 –

回答

2

感谢您输入此问题的错误(https://bugs.eclipse.org/362984)。该问题已在EclipseLink 2.4流中得到解决,并将于今天(2011年11月9日)回溯到EclipseLink 2.3.2流。您可以尝试修复从获得夜间下载:

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

以下类型的工厂:

现在,如果你使用@XmlType注释就像指定工厂类支持类:

工厂静态方法

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

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

厂与实例方法

除了静态方法,莫西允许你指定实例级别创建方法。对于这些方法,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)