JAXB绑定 - 将typesafeEnumBase设置为空(将枚举转换为字符串)

时间:2017-10-25 08:46:11

标签: xml xsd jaxb xjc jaxb2-maven-plugin

根据link

  

如果typesafeEnumBase设置为xsd:string,那么它将是一种全局方式   指定所有简单类型定义直接派生或   间接来自xsd:string并且具有枚举方面应该是   默认绑定到类型安全枚举。如果typesafeEnumBase设置为   空字符串,"" ,不会将简单的类型定义绑定到a   默认情况下,typesafe枚举类。 typesafeEnumBase的值可以是   任何原子简单类型定义除了xsd:boolean 和二进制   类型。

所以我已将binding.xjb设置为以下内容:

<jxb:globalBindings typesafeEnumBase=""/>

当运行jaxb2-maven-plugin时,我得到以下异常:

lineNumber: 5; columnNumber: 46; cvc-minLength-valid: Value '' with length = '0' is not facet-valid with respect to minLength '1' for type '#AnonType_typesafeEnumBaseglobalBindings'.
...
lineNumber: 5; columnNumber: 46; cvc-attribute.3: The value '' of attribute 'typesafeEnumBase' on element 'jxb:globalBindings' is not valid with respect to its type, 'null'.

据我了解,即使文档说明,我也无法将空字符串""设置为typesafeEnumBase。文档还提到它不能是xsd:boolean

我想要的只是将以下内容转换为String而不是enum

<xs:simpleType name="phraseID">
    <xs:restriction base="escapedStringUserType">
        <xs:enumeration value="NOT_SPECIFIED"/>
        <xs:enumeration value="X000-9999"/>
        <xs:enumeration value="X000-9998"/>
    </xs:restriction>
</xs:simpleType>

相关的SO问题是here,但由于我无法设置空字符串""或将xsd:boolean值设置为typesafeEnumBase,所以答案都不适合我(尝试过)两者)。

2 个答案:

答案 0 :(得分:2)

您可以为具有枚举限制的特定简单类型指定您不希望它映射到Java enum,如下例所示:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
        xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0">
    <jaxb:bindings
            schemaLocation="myschema.xsd" 
            node="/xs:schema/xs:simpleType[@name='phraseID']">
        <jaxb:typesafeEnumClass map="false"/>
    </jaxb:bindings>
</jaxb:bindings>

但据我所知,没有办法为所有具有枚举限制的简单类型全局设置(例如,你不能在<jaxb:typesafeEnumClass map="false"/>内直接使用<jaxb:globalBindings>

(如果有人知道如何做到这一点,我也想知道,所以请评论或回答)。

答案 1 :(得分:2)

设置以下

<jxb:globalBindings typesafeEnumMaxMembers="0"/>

不会为具有枚举限制的所有简单类型生成任何枚举,而是将它们转换为字符串,但是它会在控制台中发出警告,如下所示:

Simple type "xxx-address" was not mapped to Enum due to EnumMemberSizeCap limit. Facets count: 10, current limit: 0. You can use customization attribute "typesafeEnumMaxMembers" to extend the limit.