38.4. 自定义枚举映射

概述

如果您希望根据 xsd:string 以外的模式类型枚举的类型,则必须指示代码生成器进行映射。您也可以控制生成的枚举常数。

自定义使用 jaxb:typesafeEnumClass 元素以及一个或多个 jaxb:typesafeEnumMember 元素来完成。

也可能会有实例,即代码生成器的默认设置无法为枚举器的所有成员创建有效的 Java 标识符。您可以使用 globalBindings 自定义属性自定义代码生成器的方式。

成员名称自定义器

如果代码生成器在生成枚举的成员时遇到命名冲突,或者如果无法为枚举的成员创建有效的 Java 标识符,则默认情况下代码生成器会生成警告,且不会为枚举器生成 Java 枚举类型。

您可以通过添加 globalBinding 元素的 typesafeEnumMemberName 属性来更改此行为。表 38.2 “自定义枚举 Member Name Generation 的值” 描述了 typesafeEnumMemberName 属性的值。

表 38.2. 自定义枚举 Member Name Generation 的值

描述

skipGeneration(默认)

指定没有生成 Java enum 类型并生成警告。

generateName

指定成员名称将根据 VALUE_N 格式生成。n 从一个位置启动,会递增枚举的每个成员。

generateError

指定当代码生成器无法将枚举器映射到 Java 枚举类型时,它会生成错误。

例 38.17 “自定义来强制类型 Safe Member Names” 显示行自定义,它强制代码生成器生成类型安全成员名称。

例 38.17. 自定义来强制类型 Safe Member Names

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.0">
  <annotation>
    <appinfo>
      <jaxb:globalBindings typesafeEnumMemberName="generateName" />
    </appinfo>
  </annotation>
  ...
</schema>

类自定义器

jaxb:typesafeEnumClass 元素指定应将 XML 架构枚举元素映射到 Java enum 类型。它有两个属性,如 表 38.3 “自定义生成 Enumeration Class 的属性”。当指定 jaxb:typesafeEnumClass 元素时,它必须放在修改它的简单类型的 xsd:annotation 元素中。

表 38.3. 自定义生成 Enumeration Class 的属性

属性描述

name

指定生成的 Java enum 类型的名称。这个值必须是有效的 Java 标识符。

map

指定 enumeration 是否应该映射到 Java 枚举 类型。默认值为 true

成员自定义器

jaxb:typesafeEnumMember 元素指定 XML 架构 枚举 与 Java enum 类型常数之间的映射。您必须将一个 jaxb:typesafeEnumMember 元素用于自定义的 enumeration facet。

使用在线自定义时,可以通过以下两种方式之一使用此元素:

  • 它可以放在 enumeration facet 的 xsd:annotation 元素中修改它。
  • 它们都可放置为用于自定义 enumeration 的 jaxb:typesafeEnumClass 元素的子项。

jaxb:typesafeEnumMember 元素具有一个所需的 name 属性。name 属性指定生成的 Java enum 类型常数。这个值必须是有效的 Java 标识符。

jaxb:typesafeEnumMember 元素也具有 value 属性。该值 用于将 enumeration facet 与正确的 jaxb:typesafeEnumMember 元素相关联。value 属性的值必须与 enumeration facets' value 属性的值之一匹配。当使用外部绑定规格来自定义类型生成时,或者将 jaxb:typesafeEnumMember 元素作为 jaxb:typesafeEnumClass 元素的子项分组到 jaxb:typesafeEnumClass 元素时,需要此属性。

例子

例 38.18 “枚举类型的行自定义” 显示了一个枚举的类型,它使用在线自定义,并单独自定义枚举的成员。

例 38.18. 枚举类型的行自定义

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.0">
  <simpleType name="widgetInteger">
    <annotation>
      <appinfo>
        <jaxb:typesafeEnumClass />
      </appinfo>
    </annotation>
    <restriction base="xsd:int">
      <enumeration value="1">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="one" />
          </appinfo>
        </annotation>
      </enumeration>
      <enumeration value="2">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="two" />
          </appinfo>
        </annotation>
      </enumeration>
      <enumeration value="3">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="three" />
          </appinfo>
        </annotation>
      </enumeration>
      <enumeration value="4">
        <annotation>
          <appinfo>
            <jaxb:typesafeEnumMember name="four" />
          </appinfo>
        </annotation>
      </enumeration>
    </restriction>
  </simpleType>
<schema>

例 38.19 “使用组合映射的枚举类型的行自定义” 显示了一个枚举的类型,它使用在线自定义,并将成员的自定义组合到类自定义中。

例 38.19. 使用组合映射的枚举类型的行自定义

<schema targetNamespace="http://widget.com/types/widgetTypes"
        xmlns="http://www.w3.org/2001/XMLSchema"
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        jaxb:version="2.0">
  <simpleType name="widgetInteger">
    <annotation>
      <appinfo>
        <jaxb:typesafeEnumClass>
            <jaxb:typesafeEnumMember value="1" name="one" />
            <jaxb:typesafeEnumMember value="2" name="two" />
            <jaxb:typesafeEnumMember value="3" name="three" />
            <jaxb:typesafeEnumMember value="4" name="four" />
        </jaxb:typesafeEnumClass>
      </appinfo>
    </annotation>
    <restriction base="xsd:int">
      <enumeration value="1" />
      <enumeration value="2" />
      <enumeration value="3" />
      <enumeration value="4" >
    </restriction>
  </simpleType>
<schema>

例 38.20 “用于自定义枚举的绑定文件” 显示自定义枚举类型的外部绑定文件。

例 38.20. 用于自定义枚举的绑定文件

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
  <jaxb:bindings schemaLocation="enumMap.xsd">
    <jaxb:bindings node="xsd:simpleType[@name='widgetInteger']">
        <jaxb:typesafeEnumClass>
            <jaxb:typesafeEnumMember value="1" name="one" />
            <jaxb:typesafeEnumMember value="2" name="two" />
            <jaxb:typesafeEnumMember value="3" name="three" />
            <jaxb:typesafeEnumMember value="4" name="four" />
        </jaxb:typesafeEnumClass>
    </jaxb:bindings>
  </jaxb:bindings>
<jaxb:bindings>