38.4. 自定义枚举映射
概述
如果您希望基于 xsd:string
以外的模式类型枚举,则必须指示代码生成器来映射它。您还可以控制生成的枚举常数的名称。
自定义使用 jaxb:typesafeEnumClass
元素以及一个或多个 jaxb:typesafeEnumMember
元素来完成。
可能还会有实例,代码生成器的默认设置无法为枚举的所有成员创建有效的 Java 标识符。您可以使用 全局Binding 自定义属性来自定义代码生成器的方式
。
成员名称 customizer
如果代码生成器在生成枚举成员时遇到命名冲突,或者如果无法为枚举成员创建有效的 Java 标识符,则默认情况下代码生成器会生成一个警告,且不会为枚举生成 Java 枚举类型。
您可以通过添加 globalBinding
元素 的类型safeEnumMemberName 属性来更改此行为
。表 38.2 “自定义枚举成员名称生成的值” 中描述了 typesafeEnumMemberName
属性的值。
值 | 描述 |
---|---|
|
指定没有生成 |
|
指定以 |
|
指定代码生成器在无法将枚举映射到 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 Schema 枚举性映射到 Java 枚举类型。它有两个属性,如 表 38.3 “自定义生成的枚举类的属性” 所述。当指定
jaxb:typesafeEnumClass
元素时,它必须放在要修改的简单类型的 xsd:annotation
元素中。
属性 | 描述 |
---|---|
|
指定生成的 Java 枚举类型 |
|
指定枚举是否应映射到 Java 枚举 |
成员自定义器
jaxb:typesafeEnumMember
元素指定 XML Schema enumeration
facet 和 Java enum
type constant 之间的映射。您必须在被自定义 枚举的每个枚举
方面,使用一个 jaxb:typesafeEnumMember
元素。
使用在线自定义时,可以通过以下两种方式之一使用此元素:
-
它可以放置在被修改的
enumeration
facet 的xsd:annotation
元素中。 -
它们都可以作为用于自定义枚举的
jaxb:typesafeEnumClass
元素的子项放置。
jaxb:typesafeEnumMember
元素具有所需的 name
属性。name
属性指定生成的 Java enum
类型常的名称。它的值必须是有效的 Java 标识符。
jaxb:typesafeEnumMember
元素也具有 value
属性。该值
用于将 枚举
facet 与正确的 jaxb:typesafeEnumMember
元素相关联。value
属性的值
必须与 枚举
值的其中一个值匹配。使用外部绑定规格来自定义类型生成时,或者将 jaxb:typesafeEnumMember
元素分组为 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>