2011-05-17 124 views
20

我使用maven插件maven-jaxb2-plugin從XSD Schema文件生成POJO。 這工作正常。唯一讓我困擾的是,xml模式枚舉沒有映射到Java Enum Type中。如何使用JAXB從XML模式生成Java Enum?

我的Maven插件是從文件我叫schemachooser.xsd

schemachooser.xsd生成Java的POJO:

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:sch="http://www.ascc.net/xml/schematron" 
targetNamespace="http://schema.something" elementFormDefault="qualified" 
version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0"> 

<xs:annotation> 
    <xs:appinfo> 
     <jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true"> 
      <xjc:serializable /> 
     </jaxb:globalBindings> 
     <jaxb:schemaBindings> 
      <jaxb:bindings node="//xsd:element[@name='ElementName']/xsd:simpleType"> 
       <jaxb:typesafeEnumClass name="MyEnumType" /> 
      </jaxb:bindings> 
     </jaxb:schemaBindings> 
    </xs:appinfo> 
</xs:annotation> 

<xs:include schemaLocation="myNormalSchema.xsd" /> 

</schema> 

它生成的文件,而不是 「新」 枚舉類「MyEnumType」。我是否使用綁定錯誤?

回答

26

如果你想保持JAXB註釋從XML架構分開,那麼你需要使用JAXB綁定文件:

bindings.xml

<jaxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    jaxb:extensionBindingPrefixes="xjc" 
    version="2.1"> 
    <jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true"> 
     <xjc:serializable /> 
    </jaxb:globalBindings> 
    <jaxb:bindings schemaLocation="myNormalSchema.xsd"> 
     <jaxb:bindings node="//xs:element[@name='ElementName']/xs:simpleType"> 
       <jaxb:typesafeEnumClass name="MyEnumType" /> 
     </jaxb:bindings> 
    </jaxb:bindings> 
</jaxb:bindings> 

myNormalSchema.xsd

下面是一個示例XML模式,從您的問題中進行了逆向工程:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    targetNamespace="http://www.example.com" 
    xmlns="http://www.example.com" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="ElementName"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <xs:enumeration value="MY_ENUM_1"/> 
       <xs:enumeration value="MY_ENUM_2"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

    <xs:element name="Root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="ElementName"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

XJC呼叫

xjc -extension -d out -b bindings.xml myNormalSchema.xsd 

MyEnumType

一個生成的類是稱爲MyEnumType枚舉。

package com.example; 

import javax.xml.bind.annotation.XmlEnum; 
import javax.xml.bind.annotation.XmlType; 

@XmlType(name = "") 
@XmlEnum 
public enum MyEnumType { 

    MY_ENUM_1, 
    MY_ENUM_2; 

    public String value() { 
     return name(); 
    } 

    public static MyEnumType fromValue(String v) { 
     return valueOf(v); 
    } 

} 

另外的根類與isSet方法生成:

package com.example; 

import java.io.Serializable; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 


@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "elementName" 
}) 
@XmlRootElement(name = "Root") 
public class Root 
    implements Serializable 
{ 

    @XmlElement(name = "ElementName", required = true) 
    protected MyEnumType elementName; 

    public MyEnumType getElementName() { 
     return elementName; 
    } 

    public void setElementName(MyEnumType value) { 
     this.elementName = value; 
    } 

    public boolean isSetElementName() { 
     return (this.elementName!= null); 
    } 

} 

實例

+2

是否需要爲這種類型的所有元素進行綁定?是否有一種方法只是爲了所有受限於枚舉的字符串切換此修改?我提供的模式中有287次出現,我無法修改它們。 – 2015-08-13 15:06:01

+0

保存了我的一天,但是驢子有多大的痛苦......應該有更好的方法。 – mhvelplund 2015-12-23 12:11:25