2011-11-05 3 views
1

Je suis la définition d'une méthode d'usine statique:méthodes d'usine statiques dans JAXB Moxy

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

La raison pour laquelle je suis en utilisant des méthodes d'usine est que MyClass est abstraite, et comment obtenir une instance de celui-ci dépend de certaines annotations de la classe. Cette logique est intégrée dans la méthode d'usine createNew.

En outre, la classe d'usine DummyFactory est abstraite. Autant que je comprends les classes d'usine n'ont pas besoin de fournir un constructeur par défaut si leur méthode d'usine est statique (http://download.oracle.com/javaee/6/api/javax/xml/bind/annotation/XmlType.html).

Ceci est une simplification brute de la façon dont la classe d'usine ressemble à:

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

Cependant, lorsque je tente de désorganiser un document XML, je reçois l'exception suivante:

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 

Première Je pensais que je n'avais pas obtenu quelque chose correctement dans l'explication des classes et des méthodes d'usine, mais ensuite j'ai essayé avec JAXB RI et cela fonctionne bien là. Donc ma question est:

Existe-t-il un moyen de faire fonctionner MOXy avec des classes d'usine abstraites?

(JAXB RI me donne d'autres types de problèmes, c'est la raison pour laquelle je préférerais ne pas l'utiliser).

+0

Je suis le chef de file Moxy et cela semble être un bug. Pourriez-vous entrer un bogue pour ce problème: https://bugs.eclipse.org/bugs/enter_bug.cgi?product=EclipseLink. Nous devrions être en mesure d'obtenir une solution sur Moday. –

+0

Terminé. Bug soumis: https://bugs.eclipse.org/bugs/show_bug.cgi?id=362984. Merci beaucoup pour la réponse rapide. – Sergio

+0

Nous avons trouvé la solution, nous avons juste besoin de débusquer les tests. Je pense que nous allons vérifier le correctif demain. –

Répondre

2

Nous vous remercions d'entrer un bogue pour ce problème (https://bugs.eclipse.org/362984). Le problème a été corrigé dans le flux EclipseLink 2.4 et sera rétroporté aujourd'hui (9 novembre 2011) dans le flux EclipseLink 2.3.2. Vous pouvez essayer le correctif obtenir un téléchargement de nuit à partir de:

Maintenant, si vous spécifiez une classe d'usine en utilisant l'annotation @XmlType comme:

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

Les types d'usine suivants les classes sont supportées:

Usine avec des méthodes statiques

Avec ce correctif de bogue, lorsque MOXy utilise la méthode usine pour créer une instance de MyClass, une instance de DummyFactory n'est pas créée.

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

usine Méthodes d'instance

En plus des méthodes statiques, Moxy vous permet de spécifier les méthodes de création de niveau d'instance. Pour ces méthodes, MOXy créera une instance de la classe factory.

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

Cette configuration n'est pas autorisé dans le JAXB RI, et vous obtiendrez l'exception suivante:

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)