jaxb2-maven-plugin 3.2.0无法生成枚举类的技术咨询
问题描述
我有一个XSD文件,使用jaxb2-maven-plugin 3.2.0版本生成Java类,但枚举类始终无法生成,即便在绑定文件中做了配置。
XSD片段
<xs:element name="action"> <xs:simpleType> <xs:restriction base="xXX-0058:actionType"> <xs:enumeration value="1"> <xs:annotation> <xs:documentation xml:lang="de">Neue Nachricht</xs:documentation> <xs:documentation xml:lang="fr">Message nouveau</xs:documentation> <xs:documentation xml:lang="it">Nuovo messaggio</xs:documentation> </xs:annotation> </xs:enumeration> <xs:enumeration value="3"> <xs:annotation> <xs:documentation xml:lang="de">Widerruf</xs:documentation> <xs:documentation xml:lang="fr">Révocation</xs:documentation> <xs:documentation xml:lang="it">Revoca</xs:documentation> </xs:annotation> </xs:enumeration> <xs:enumeration value="5"> <xs:annotation> <xs:documentation xml:lang="de">Anfrage</xs:documentation> <xs:documentation xml:lang="fr">Demande</xs:documentation> <xs:documentation xml:lang="it">Domanda</xs:documentation> </xs:annotation> </xs:enumeration> <xs:enumeration value="6"> <xs:annotation> <xs:documentation xml:lang="de">Antwort</xs:documentation> <xs:documentation xml:lang="fr">Réponse</xs:documentation> <xs:documentation xml:lang="it">Risposta</xs:documentation> </xs:annotation> </xs:enumeration> </xs:restriction> </xs:simpleType> </xs:element>
bindings.xjb配置
<jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true" typesafeEnumBase="xXX-0058:actionType" typesafeEnumMemberName="generateName"> <xjc:serializable uid="-1" /> </jaxb:globalBindings>
xXX-0058:actionType的XSD定义
<xs:simpleType name="actionType"> <xs:restriction base="xs:string"> <xs:maxLength value="2"/> <xs:minLength value="1"/> <xs:enumeration value="1"/> <xs:enumeration value="3"/> <xs:enumeration value="4"/> <xs:enumeration value="5"/> <xs:enumeration value="6"/> <xs:enumeration value="8"/> <xs:enumeration value="9"/> <xs:enumeration value="10"/> <xs:enumeration value="12"/> </xs:restriction> </xs:simpleType>
疑问点
- 遗漏了什么配置?
- 这些多语言文档会如何处理?
- 生成的枚举类结构是怎样的?
- 枚举类会生成在XSD对应的Java类中还是xXX-0058的类中?
问题解答
1. 遗漏的配置分析
当前配置有两个关键问题导致枚举无法生成:
- 全局绑定的
typesafeEnumBase作用范围不对:这个配置是让JAXB把指定基类型的所有限制类型生成枚举,但你的action元素是在xXX-0058:actionType基础上做了二次限制,JAXB默认不会为这种嵌套简单类型生成独立枚举,需要显式绑定。 - 缺少针对
action元素的局部绑定:必须在bindings.xjb中为action元素的简单类型明确指定生成枚举,不能只依赖全局配置。
修正后的bindings.xjb示例(需替换命名空间前缀对应的实际URI):
<jaxb:bindings xmlns:jaxb="https://jakarta.ee/xml/ns/jaxb" xmlns:xjc="https://jakarta.ee/xml/ns/jaxb/xjc" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xXX-0058="你的xXX-0058命名空间URI" version="3.0"> <jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true" typesafeEnumMemberName="generateName"> <xjc:serializable uid="-1" /> </jaxb:globalBindings> <!-- 为action元素的简单类型显式绑定生成枚举 --> <jaxb:bindings schemaLocation="你的XSD文件路径"> <jaxb:bindings node="//xs:element[@name='action']/xs:simpleType"> <jaxb:typesafeEnumClass name="ActionEnum" /> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
另外要确认:
- Maven插件配置里正确指定了
bindingDirectory和bindingFiles,确保插件能读取到bindings.xjb。 - XSD中的
xXX-0058前缀在bindings.xjb中正确声明并关联了实际URI。
2. 多语言文档的处理
JAXB默认不会自动处理带xml:lang属性的多语言文档,常见处理方式有两种:
- 合并到JavaDoc:默认情况下,所有语言的文档内容会被合并到枚举常量的JavaDoc注释中,比如:
/** * Neue Nachricht * Message nouveau * Nuovo messaggio */ VALUE_1("1"), - 自定义处理:可以编写XJC插件解析多语言文档,将其注入到枚举的字段或生成单独的国际化资源文件;也可以生成类后手动把多语言内容整理到项目的
messages_de.properties等资源文件中。
3. 生成的枚举类结构
修正配置后,生成的枚举类大致结构如下(以ActionEnum为例):
import jakarta.xml.bind.annotation.XmlEnum; import jakarta.xml.bind.annotation.XmlEnumValue; import jakarta.xml.bind.annotation.XmlType; @XmlType(name = "") @XmlEnum public enum ActionEnum { @XmlEnumValue("1") NEW_MESSAGE("1"), @XmlEnumValue("3") REVOCATION("3"), @XmlEnumValue("5") REQUEST("5"), @XmlEnumValue("6") RESPONSE("6"); private final String value; ActionEnum(String v) { value = v; } public String value() { return value; } public static ActionEnum fromValue(String v) { for (ActionEnum c : ActionEnum.values()) { if (c.value.equals(v)) { return c; } } throw new IllegalArgumentException(v); } }
因为配置了typesafeEnumMemberName="generateName",枚举常量名会根据文档内容生成更友好的名称,而非默认的VALUE_1格式。
4. 枚举类的生成位置
- 如果你在绑定中指定了
jaxb:typesafeEnumClass name="ActionEnum"且未指定package,枚举类会生成在当前XSD对应的Java包中,作为独立类。 - 如果没有显式指定,JAXB会把它作为
action元素所在宿主类的内部枚举(比如action属于Root类,就会生成Root.ActionEnum)。 - 注意:
xXX-0058:actionType本身默认不会生成枚举,除非你也为它添加绑定配置,它默认会被生成为String类型的Java类。
内容的提问来源于stack exchange,提问作者OllieBond
相关产品推荐
相关产品推荐

