2009-10-03 3 views
24

У меня возникли проблемы с генерацией классов Java с соответствующими аннотациями JAXB от XSD с использованием XJC.Как создать классы @XmlRootElement для базовых типов в XSD?

У меня относительно простой XSD-файл, определяющий мою XML-схему. Сложные типы в XSD используют наследование с использованием тегов <xs:extension>. Проблема, которую я имею в том, что мне нужны все сложные типы для генерации Java-классов с помощью @XmlRootElement.

К сожалению, способ, которым XJC генерирует классы, означает, что только производный класс получает @XmlRootElement (а не базовый класс). Я использую простую глобальную директиву привязки, чтобы гарантировать, что она решает многие другие проблемы, с которыми я столкнулся с XJC.

Ниже приведен пример фрагмент кода из XSD:

<xs:schema version="1.0" targetNamespace="http://www.knowledgemill.com/kmcs" 
    xmlns:kmcs="http://www.knowledgemill.com/kmcs" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="2.0" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    jaxb:extensionBindingPrefixes="xjc" 
    elementFormDefault="qualified"> 
    <xs:annotation> 
     <xs:appinfo> 
      <jaxb:globalBindings> 
       <xjc:simple /> 
      </jaxb:globalBindings> 
     </xs:appinfo> 
    </xs:annotation> 

    <xs:element name="Artifact" type="kmcs:Artifact"/> 
    <xs:element name="EmailArtifact" type="kmcs:EmailArtifact"/> 

    <xs:complexType name="Artifact"> 
     <xs:sequence> 
      <xs:element name="artifactId" type="xs:string" minOccurs="0"/> 
      <xs:element name="artifactType" type="xs:string" minOccurs="0"/> 
      <xs:element name="contentHash" type="xs:string" minOccurs="0"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="EmailArtifact"> 
     <xs:complexContent> 
      <xs:extension base="kmcs:Artifact"> 
       <xs:sequence> 
        <xs:element name="subject" type="xs:string" minOccurs="0"/> 
        <xs:element name="threadSubject" type="xs:string" minOccurs="0"/> 
        <xs:element name="from" type="xs:string" minOccurs="0"/> 
        <xs:element name="to" type="xs:string" minOccurs="0"/> 
        <xs:element name="cc" type="xs:string" minOccurs="0"/> 
        <xs:element name="bcc" type="xs:string" minOccurs="0"/> 
        <xs:element name="messageId" type="xs:string" minOccurs="0"/> 
        <xs:element name="date" type="xs:date" minOccurs="0"/> 
        <xs:element name="size" type="xs:long" minOccurs="0"/> 
        <xs:element name="hasAttachment" type="xs:boolean" minOccurs="0"/> 
        <xs:element name="sensitivity" type="xs:string" minOccurs="0"/> 
        <xs:element name="headerHash" type="xs:string" minOccurs="0"/> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 


</xs:schema> 

Как видно из приведенного выше фрагмента кода, EmailArtifact расширяет Artifact.

код Java-класс для EmailArtifact содержит следующее:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "EmailArtifact", propOrder = { 
    "subject", 
    "threadSubject", 
    "from", 
    "to", 
    "cc", 
    "bcc", 
    "messageId", 
    "date", 
    "size", 
    "hasAttachment", 
    "sensitivity", 
    "headerHash" 
}) 
@XmlSeeAlso({ 
    ExtendedEmail.class 
}) 
@XmlRootElement(name = "EmailArtifact") 
public class EmailArtifact 
    extends Artifact 
{ 

    protected String subject; 
    protected String threadSubject; 
    protected String from; 
    protected String to; 
    protected String cc; 
    protected String bcc; 
    protected String messageId; 
    @XmlSchemaType(name = "date") 
    protected XMLGregorianCalendar date; 
    protected Long size; 
    protected Boolean hasAttachment; 
    protected String sensitivity; 
    protected String headerHash; 

код Java-класс для Artifact содержит следующее:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "Artifact", propOrder = { 
    "artifactId", 
    "artifactType", 
    "contentHash" 
}) 
@XmlSeeAlso({ 
    ManagedDocArtifact.class, 
    EmailArtifact.class 
}) 
public class Artifact { 

    protected String artifactId; 
    protected String artifactType; 
    protected String contentHash; 

В EmailArtifact мы видим, что она содержит @XmlRootElement но базовый тип Artifact не содержит @XmlRootElement.

Как вы можете заставить XJC генерировать @XmlRootElement для всех классов, включая базовые типы.

+0

Простой режим привязки должен сделать это. Вы уверены, что задаете это правильно? – skaffman

+0

Да довольно уверенно я - вот вершина моей XSD с соответствующим globalBindings ... <хз: схема версии = "1,0 " xmlns: xs =" http://www.w3.org/2001/XMLSchema " xmlns: jaxb =" http://java.sun.com/xml/ns/jaxb " jaxb: version =" 2.0 " xmlns: xjc =" http: //java.sun.ком/XML/нс/JAXB/XJC» JAXB: extensionBindingPrefixes = "XJC" > <хз: аннотацию> jallch

+0

Да, это должно работать, я думаю, хотя я всегда использовал внешние привязки привязки, а не встроенные. – skaffman

ответ

3

Это question ссылки blog сообщение от Kohsuke Кавагути, ранее работавшей на JAX-B или JAX-WS RI, что переговоры о процессе и отсутствие ясности в решении RI, делающих по этому вопросу в спецификации.

В сообщении в блоге упоминается, что простая функция привязки является частью RI. Используете ли вы RI для генерации кода?

28

Просто привязку xjb-файл:

<?xml version="1.0"?> 
<jxb:bindings version="1.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" jxb:extensionBindingPrefixes="xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <jxb:bindings schemaLocation="path/to/myschema.xsd" node="/xs:schema"> 
    <jxb:globalBindings> 
     <xjc:simple /> 
    </jxb:globalBindings> 
    </jxb:bindings> 
</jxb:bindings> 

И не забудьте определить элемент того же типа:

<xs:complexType name="Artifact" /> 
<xs:element name="artifact" type="Artifact"> 
+2

Спасибо! Это лучшее решение. Это не нужно изменять xsd-схему и не нужно изменять сгенерированный класс root. –

+0

Не могли бы вы объяснить вторую часть о необходимости определения и элемента того же типа? Где это определено? Я надеялся не менять XSD или сгенерированные классы. – iX3

+2

Это работало и на меня. Оба свойства в jxb: привязки не нужны. Кроме того, мне пришлось предоставить компилятор xjc с параметром extension = true командной строки (в Ant-Script). – Heri

Смежные вопросы