Pourquoi ne JAXB dire “xxx est une interface, et JAXB ne peut pas gérer les interfaces”. Même si la classe générée n'est pas une interface
J'ai utilisé JAXB pour lier mon xsd et ensuite essayé de créer le JAXBContext:
JAXBContext jaxbContext = JAXBContext.newInstance("my package name");
Mais JAXB donne 180 IllegalAnnotationsException.
La plupart des exceptions sont les messages suivants:
- XXX est une interface, et JAXB ne peut pas gérer les interfaces
- XXX n'a pas un no-arg constructeur par défaut
- @XmlAttribute/@XmlValue besoin de faire référence à un type Java qui correspond à un texte en XML.
Quand je regarde les classes générées aucun d'entre eux sont des interfaces et je ne comprends pas pourquoi JAXB est à interpréter comme des interfaces.
Ici, c'est la trace de la pile de l'une des erreurs signalées par JAXB :
com.sc.md.datatypes.schemas.csemessage.EnvelopeType is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at com.sc.md.datatypes.schemas.csemessage.EnvelopeType
at protected com.sc.md.datatypes.schemas.csemessage.EnvelopeType com.sc.md.datatypes.schemas.csemessage.cseMessage.envelope
at com.sc.md.datatypes.schemas.csemessage.cseMessage
com.sc.md.datatypes.schemas.csemessage.EnvelopeType does not have a no-arg default constructor.
this problem is related to the following location:
at com.sc.md.datatypes.schemas.csemessage.EnvelopeType
at protected com.sc.md.datatypes.schemas.csemessage.EnvelopeType com.sc.md.datatypes.schemas.csemessage.cseMessage.envelope
at com.sc.md.datatypes.schemas.csemessage.cseMessage
Et ce est la façon dont le type est défini dans xsd :
<xs:complexType name="EnvelopeType">
<xs:sequence>
<xs:element name="Sent" type="DateTimeType"/>
<xs:element name="Identifier" type="String_1_14"/>
<xs:element name="AcknowledgementCode" type="AcknowledgementCodeType"/>
</xs:sequence>
<xs:simpleType name="AcknowledgementCodeType">
<xs:restriction base="xs:string">
<xs:enumeration value="m"/>
<xs:enumeration value="p"/>
</xs:restriction>
</xs:simpleType>
Ici est la pom.xml j'ai utilisé pour générer la liaison :
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cs</groupId>
<artifactId>cs-jaxb</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.4-1</version>
</dependency>
</dependencies>
<name>cs jaxb</name>
<version>1.0.0</version>
<parent>
<artifactId>hip-jaxb-parent</artifactId>
<groupId>com.cs</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.8.0</version>
<executions>
<execution>
<id>CS</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources/</schemaDirectory>
<schemaIncludes>
<include>**/*.xsd</include>
</schemaIncludes>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<inherited>true</inherited>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
S'il vous plaît être patient avec moi car c'est la première fois que je te pose une question sur le web 🙂
Poster plus d'info ne peut pas dire à partir de rien, vous avez posté.
Est 'EnvelopeType est vraiment une interface? Est-il possible que vous essayez d'utiliser un JAXB 1 modèle avec un JAXB 2 runtime?
Merci pour votre réponse, j'ai joint le pom.xml j'ai utilisé aussi mon exécution est JAXB2.
Un homme du nom de
Est 'EnvelopeType est vraiment une interface? Est-il possible que vous essayez d'utiliser un JAXB 1 modèle avec un JAXB 2 runtime?
Merci pour votre réponse, j'ai joint le pom.xml j'ai utilisé aussi mon exécution est JAXB2.
Un homme du nom de
Kohsuke Kawaguchi
:), qui a l'air très peu de relation avec JAXB
🙂 écrit à propos de cette question. JAXB et interfaces
OriginalL'auteur Alok Chandna | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
Merci à tous, c'était comme d'habitude une grosse erreur de ma part, mais de toute façon j'ai apprécié l'aide de stackoverflow pour la première fois et va faire un point de découvrir ici.
Le problème était avec mon classpath.Je faisais allusion à un xmlbeans de liaison du projet, qui avait la java de la source avec le même forfait et les classes que celles produites par jaxb, qui ont été inclus comme un pot sur mon classpath.
J'ai donc eu 2 classes avec le même nom et le paquet, mais à ma misère JAXB était en train de cueillir les Xmlbeans classe et je ne savais pas que pour 2 jours.C'est l'une des plus anciennes erreurs en Java et je m'excuse pour l'erreur.Si quelqu'un a besoin de précisions nous vous invitons à laisser un commentaire.
OriginalL'auteur Alok Chandna
Avez-vous annoté de toutes les classes racines avec le
@XmlRootElement
annotation?Voir: Officieux de JAXB Guide de Cartographie des interfaces - Java.net
Deuxième, je vous recommande de ne pas créer votre JAXBContext via
JAXBContext.newInstance("my package name");
. Il est préférable de spécifier la racine des classes explicitement. Par conséquent, si vous avez deux classes racines nomméClassA
etClassB
utiliser de cette façon:@XmlRootElement
. Si le modèle est généré à partir d'un schéma XML, puis la création de laJAXBContext
sur leString
chemin de contexte est la meilleure option.OriginalL'auteur Robert
Je soupçonne que vous essayez d'utiliser un JAXB 1 (JSR-31) modèle avec un JAXB 2 (JSR-222) de l'exécution. Dans JAXB 1 implémentations généré spec des interfaces définies soutenu par la mise en œuvre spécifique impl clases. Dans JAXB 2 c'est devenu spec classes définies avec annotations standard qui sont compatibles avec toutes les implémentations. La plupart des JAXB 2 implémentations de prendre en charge leur propre JAXB 1 modèles, mais certains autres config peut être nécessaire, si vous essayez d'utiliser un JAXB 1 modèle avec une différence JAXB 2 fournisseur, vous pouvez voir ce type d'erreur.
OriginalL'auteur bdoughan