2013-09-06 3 views
3

Je suis très nouveau pour JAXB et ce plugin maven-jaxb2classes Java Génération utilisant maven-jaxb2-plugin

Voici mon fichier xsd:

<xs:element name="user" type="user" /> 
<xs:element name="userList" type="userList" /> 

<xs:complexType name="user"> 
    <xs:all> 
     <xs:element name="id" type="xs:long" minOccurs="0" /> 
     <xs:element name="name" type="xs:string" /> 
     <xs:element name="registrationDate" type="xs:dateTime" /> 
    </xs:all> 
</xs:complexType> 

<xs:complexType name="userList"> 
    <xs:sequence> 
     <xs:element name="user" type="user" minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:complexType> 

Voici mon fichier .xjb:

<!-- Annotate @XmlRootElement Annotation for all the classes, that matches 
     in the .xsd with complexType --> 
    <jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema"> 
     <jaxb:bindings node="xs:complexType['1'='1']" multiple="true" 
      required="false"> 
      <annox:annotate> 
       <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" 
        name="user" /> 
      </annox:annotate> 
     </jaxb:bindings> 
    </jaxb:bindings> 

et quand il génère lui donne la classe java un peu comme:

XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "user", propOrder = { 

}) 
@Entity 
@XmlRootElement(name = "${@name}") 
@Table(schema = "schemaName", uniqueConstraints = { 

}, name = "user_") 
public class User 
    implements Serializable, ToString 
{ 

    private final static long serialVersionUID = 1L; 
    protected Long id; 

où il doit donner le nom = nom de l'objet, comme ici « utilisateur » Je sais que si j'écris dans reliures comme celui-ci il genearate

<jaxb:bindings schemaLocation="schema.xsd" node="/xs:schema"> 
     <jaxb:bindings node="xs:complexType[@name='user']"> 
      <annox:annotate> 
       <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="user" /> 
      </annox:annotate> 
     </jaxb:bindings> 
     <jaxb:bindings node="xs:complexType[@name='userList']"> 
      <annox:annotate> 
       <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="userList" /> 
      </annox:annotate> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

mais je ne veux pas répéter le même code pour l'utilisateur et userlist est Je peux y arriver de toute façon par des annotations ou en définissant une expression régulière. S'il vous plaît suggérer un moyen.

Je voulais juste savoir quoi écrire dans ce code

<annox:annotate> 
    <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" 
        name="user" /> 
</annox:annotate> 

de telle sorte que lorsqu'il crée la classe utilisateur, il affiche @XmlRootElement (name = « utilisateur ») et similairement pour les autres @XmlRootElement de classe (name = 'userList') et similaire pour les autres.

Répondre

2

Vous devez utiliser

<jxb:bindings node="xs:complexType" multiple="true"> 
    <annox:annotate> 
    <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" /> 
    </annox:annotate> 
</jxb:bindings> 

à savoir laisser l'name attribut non spécifiée dans l'élément annox:annotate.

Cela met une annotation @XmlRootElement sans propriétés sur la classe générée pour chaque type complexe, dans ce cas:

@XmlRootElement 
public class User { 
... 
} 

@XmlRootElement 
public class UserList { 
... 
} 

En raison de la façon dont @XmlRootElement œuvres, c'est tout ce dont vous avez besoin. Si vous ne spécifiez pas de valeur pour l'élément name, il est dérivé du nom de la classe par défaut (see the Oracle docs - examples 1 & 2), qui est le même que votre nom de type complexe.

En d'autres termes, le code ci-dessus est exactement le même que celui-ci.

@XmlRootElement(name="user") 
public class User { 
... 
} 

@XmlRootElement(name="userList") 
public class UserList { 
... 
} 

Ce qui est exactement ce que vous voulez.

Juste une note supplémentaire - le sélecteur XPath node="xs:complexType['1'='1']" est inutile - vous pouvez simplement utiliser node="xs:complexType" pour obtenir tous les éléments <xs:complexType>.

Questions connexes