2014-10-24 4 views
3

У меня есть схема xsd, из которой я генерирую некоторые классы Java. Я использую jaxb для поколения.Схема JAXB для Java Различное имя XmlRootElement и имя класса

Я хочу, чтобы иметь возможность генерировать класс, аннотированный с помощью @XmlRootElement, но я хочу, чтобы свойство name @XmlRootElement отличалось от имени сгенерированного класса.

В моей XSD я определяю следующие:

<xs:element name="customer"> 
    <xs:complexType> 
     <xs:sequence> 
     .... 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Этот фрагмент кода генерирует следующий класс Java:

@XmlRootElement(name = "customer") 
public class Customer { 
... 
} 

Имя свойство @XmlRootElement является таким же, как имя генерируемого класса. Я хочу, чтобы сгенерированное имя класса было CustomerReques t.

Я попытался использовать определение jaxb:class, чтобы изменить имя кластера. В действительности этот параметр изменяет имя класса, но удаляет аннотацию @XmlRootElement, и мне нужно, чтобы она присутствовала.

Следующая XSD:

<xs:element name="customer"> 
    <xs:complexType> 
     <xs:annotation> 
       <xs:appinfo> 
        <jaxb:class name="CustomerRequest"/> 
       </xs:appinfo> 
      </xs:annotation> 
     <xs:sequence> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Формирует этот класс:

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

}) 
public class CustomerRequest { 
} 

Как я могу сделать имя свойства @XmlRootElement аннотацию отличается от генерируемого имени класса без потери аннотации?

Решение: Пользователь Xstian предложил правильное решение, используя внешние привязки. Просто для дальнейшего использования, я буду обновлять свой собственный пост с решением переоборудован для использования встроенных привязок:

<xs:element name="customer"> 
     <xs:complexType> 
      <xs:annotation> 
       <xs:documentation>Request object for the operation that checks if a customer profile exists.</xs:documentation> 
       <xs:appinfo> 
         <annox:annotate> 
          <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" name="customer"/> 
         </annox:annotate> 
         <jaxb:class name="CustomerRequest"/> 
        </xs:appinfo> 
       </xs:annotation> 
      <xs:sequence> 
      </xs:sequece> 
    </xs:complexType> 
</xs:element> 
+0

Теперь вы можете использовать синтаксис Java в JAXB2 Annotate Plugin. Что-то вроде '@ javax.xml.bind.annotation.XmlRootElement (name =" customer ", namespace =" yourNamespaceIfYouWant "') должно работать вместо внутреннего элемента 'annox: annotate'. (Я автор.) – lexicore

ответ

4

Я предлагаю вам использовать этот привязок

<bindings version="2.0" xmlns="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    xmlns:annox="http://annox.dev.java.net" 
    xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix"> 
    <bindings schemaLocation="../your.xsd"> 

     <bindings node="//xs:element[@name='customer']//xs:complexType"> 
      <annox:annotate> 
       <annox:annotate annox:class="javax.xml.bind.annotation.XmlRootElement" 
        name="customer" namespace="yourNamespaceIfYouWant"> 
       </annox:annotate> 
      </annox:annotate> 
      <class name="CustomerRequest"/> 
     </bindings> 

    </bindings> 
</bindings> 

Класс

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "header" 
}) 
@XmlRootElement(name = "customer", namespace = "yourNamespaceIfYouWant") 
public class CustomerRequest 
+0

Теперь вы можете использовать синтаксис Java в JAXB2 Annotate Plugin. Что-то вроде '@ javax.xml.bind.annotation.XmlRootElement (name =" customer ", namespace =" yourNamespaceIfYouWant ")' должно работать вместо внутреннего элемента annox: annotate. – lexicore

+0

Хм, я вижу, вы используете annox для ввода аннотации в классе. Это может сработать, но кажется сложным: p Я попробую ваше решение с внешним связыванием, которое вы разместили, и с внутренними привязками –

+0

Я предпочитаю внешнюю привязку, чтобы сделать ясную и java \ JAXB независимой от XSD. – Xstian