2013-09-06 5 views
3

Я новичок в JAXB и этот Maven-плагин jaxb2Генерация классов Java с использованием Maven-jaxb2-плагин

Вот мой 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> 

Вот мой .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> 

и когда он генерирует это дает класс Java несколько, как:

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; 

, где он должен дать имя = имя объекта, например, как здесь «пользователь» Я знаю, что если я пишу в переплетах, как это будет 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> 

, но я не хочу, чтобы повторить тот же код пользователя и список пользователей является я могу сделать это путем аннотаций или определения регулярного выражения. Пожалуйста, предложите какой-то способ.

Я просто хотел бы знать, что написать в этом коде

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

так, что, когда он создает класс пользователя это показать @xmlRootElement (имя = «пользователь») и точно также для других классов @xmlRootElement (имя = 'userList') аналогично для других.

ответ

2

Вы должны использовать

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

т.е. оставить name атрибута не определено в annox:annotate элемента.

Это ставит @XmlRootElement аннотацию без свойств на классе генерируемого для каждого сложного типа, в данном случае:

@XmlRootElement 
public class User { 
... 
} 

@XmlRootElement 
public class UserList { 
... 
} 

Из-за способом @XmlRootElement работ, это все, что вам нужно. Если вы не укажете значение для элемента name, оно выводится из имени класса по умолчанию (see the Oracle docs - примеры 1 & 2), что совпадает с вашим сложным типом.

Иными словами, приведенный выше код в точности совпадает с этим.

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

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

Это именно то, что вы хотите.

Просто дополнительное примечание - селектор node="xs:complexType['1'='1']" XPath ненужно - вы можете просто использовать node="xs:complexType", чтобы получить все <xs:complexType> элементы.