Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 枚举值包含加号和减号时xsd生成失败_Java_Xml_Xsd - Fatal编程技术网

Java 枚举值包含加号和减号时xsd生成失败

Java 枚举值包含加号和减号时xsd生成失败,java,xml,xsd,Java,Xml,Xsd,我们使用xsd XML schema生成java类,当按如下方式设置枚举时,不会生成任何文件(也不会报告错误)。xsd schema的一部分: <xsd:simpleType name="UserTimeZoneData"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="UTC"/> <xsd:enumeration

我们使用xsd XML schema生成java类,当按如下方式设置枚举时,不会生成任何文件(也不会报告错误)。xsd schema的一部分:

<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不可能同时存在。
如何解决这个问题?需要您的帮助,谢谢。

它无法为常量生成唯一的名称,因为它试图用下划线替换特殊字符(与Java变量命名有关),剩下的是重复的变量名称

GMT+9 -> GMT_9
GMT-9 -> GMT_9
因此有两个同名的变量,这就是它失败的地方

我们可以通过使用
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);
    }

}
import javax.xml.bind.annotation.XmlEnum;
导入javax.xml.bind.annotation.XmlEnumValue;
导入javax.xml.bind.annotation.XmlType;
/**
*UserTimeZoneData的Java类。
* 
*以下架构片段指定此类中包含的预期内容。
*
* 
*simpleType name=“UserTimeZoneData”>
*限制基数=”{http://www.w3.org/2001/XMLSchema}字符串“>
*枚举值=“UTC”/>
*枚举值=“GMT+9”/>
*枚举值=“GMT-9”/>
*/限制>
*/simpleType>
* 
* 
*/
@XmlType(name=“UserTimeZoneData”,namespace=”“)
@XmlEnum
公共枚举UserTimeZoneData{
UTC(“UTC”),
@XmlEnumValue(“GMT+9”)
GMT加9(“GMT+9”),
@XmlEnumValue(“GMT-9”)
格林尼治标准时间-9(“格林尼治标准时间-9”);
私有最终字符串值;
UserTimeZoneData(字符串v){
值=v;
}
公共字符串值(){
返回值;
}
公共静态UserTimeZoneData fromValue(字符串v){
对于(UserTimeZoneData c:UserTimeZoneData.values()){
如果(c.值等于(v)){
返回c;
}
}
抛出新的IllegalArgumentException(v);
}
}

参考:

您使用的是什么库来生成Java类?什么版本?嗨,我们使用jaxb-xjc.jar verion1.0。它可以工作。非常感谢!很抱歉,我没有投票权。@Bright.H你有投票权。