2015-12-25 52 views
1

我們使用xsd XML模式生成java類,將枚舉設置爲如下時,將不會生成文件(也沒有錯誤報告)。xsd模式的部分:當枚舉值包含正負號時,xsd編譯失敗

<xsd:simpleType name="UserTimeZoneData"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="UTC"/> 
      <xsd:enumeration value="GMT+9"/> 
      <xsd:enumeration value="GMT-9"/> 
</xsd:restriction>  
</xsd:simpleType> 

我測試並驗證了一些情況,發現當我刪除GMT + 9或GMT-9時,它會工作。看來GMT + 9和GMT-9不能同時存在。 我該如何解決這個問題?需要你的幫助,謝謝。

+0

你在使用生成的Java類庫?什麼版本? –

+0

嗨,我們使用jaxb-xjc.jar verion1.0。 –

回答

2

它不能爲常量生成唯一的名稱,因爲它試圖用下劃線替換特殊字符(與Java變量命名有關),它留下了重複的變量名。

GMT+9 -> GMT_9 
GMT-9 -> GMT_9 

因此,存在2個變量具有相同的名稱,這是它失敗。

我們可以強制JAXB使用typesafeEnumMember

使用某些變量名下面的例子來看看

XSD

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    jaxb:version="2.0"> 

    <xsd:simpleType name="UserTimeZoneData"> 
     <xsd:restriction base="xsd:string"> 
      <xsd:enumeration value="UTC" /> 
      <xsd:enumeration value="GMT+9"> 
       <xsd:annotation> 
        <xsd:appinfo> 
         <jaxb:typesafeEnumMember name="GMT_PLUS_9" /> 
        </xsd:appinfo> 
       </xsd:annotation> 
      </xsd:enumeration> 
      <xsd:enumeration value="GMT-9"> 
       <xsd:annotation> 
        <xsd:appinfo> 
         <jaxb:typesafeEnumMember name="GMT_MINUS_9" /> 
        </xsd:appinfo> 
       </xsd:annotation> 
      </xsd:enumeration> 
     </xsd:restriction> 
    </xsd:simpleType> 
</xsd:schema> 

生成的Java文件

UserTimeZoneData.java

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


/** 
* <p>Java class for UserTimeZoneData. 
* 
* <p>The following schema fragment specifies the expected content contained within this class. 
* <p> 
* <pre> 
* &lt;simpleType name="UserTimeZoneData"> 
* &lt;restriction base="{http://www.w3.org/2001/XMLSchema}string"> 
*  &lt;enumeration value="UTC"/> 
*  &lt;enumeration value="GMT+9"/> 
*  &lt;enumeration value="GMT-9"/> 
* &lt;/restriction> 
* &lt;/simpleType> 
* </pre> 
* 
*/ 
@XmlType(name = "UserTimeZoneData", namespace = "") 
@XmlEnum 
public enum UserTimeZoneData { 

    UTC("UTC"), 
    @XmlEnumValue("GMT+9") 
    GMT_PLUS_9("GMT+9"), 
    @XmlEnumValue("GMT-9") 
    GMT_MINUS_9("GMT-9"); 
    private final String value; 

    UserTimeZoneData(String v) { 
     value = v; 
    } 

    public String value() { 
     return value; 
    } 

    public static UserTimeZoneData fromValue(String v) { 
     for (UserTimeZoneData c: UserTimeZoneData.values()) { 
      if (c.value.equals(v)) { 
       return c; 
      } 
     } 
     throw new IllegalArgumentException(v); 
    } 

} 

參考:https://access.redhat.com/documentation/en-US/Red_Hat_JBoss_Fuse/6.0/html/Developing_Applications_Using_JAX-WS/files/JAXWSCustomTypeMappingEnum.html

+0

它的工作原理。非常感謝!對不起,我沒有能力投票。 –

+0

不客氣! – 11thdimension

+0

@ Bright.H你可以[接受](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – kjhughes