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