首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举值包含正负号时,xsd生成失败

枚举值包含正负号时,xsd生成失败
EN

Stack Overflow用户
提问于 2015-12-25 09:56:09
回答 1查看 418关注 0票数 1

我们使用xsd XML schema来生成java类,当按照如下方式设置枚举时,将不会生成xsd schema的.Part文件(也不会报告错误):

代码语言:javascript
复制
<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不能同时存在。

EN

回答 1

Stack Overflow用户

发布于 2015-12-25 14:13:05

它不能为常量生成唯一的名称,因为它试图用下划线替换特殊字符(与Java变量命名相关),留下重复的变量名称。

代码语言:javascript
复制
GMT+9 -> GMT_9
GMT-9 -> GMT_9

因此,有两个变量具有相同的名称,这就是它失败的地方。

我们可以通过使用typesafeEnumMember来强制JAXB使用某些变量名

看一下下面的例子

XSD

代码语言:javascript
复制
<?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

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34459398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档