如何用XPath定位xs:string扩展内容以配置XJC注解?
解决jaxb2-basics-annotate定位simpleContent扩展生成的@XmlValue属性问题
我刚好碰到过类似的场景,你遇到的核心问题是:simpleContent扩展生成的@XmlValue字段对应的XPath定位逻辑和普通属性不一样,因为它对应的是XML schema里complexType的simpleContent下的extension部分,而不是一个普通的xs:element或xs:attribute。
问题分析
你的XSD里的ExpressionType是xs:string的simpleContent扩展,结构大概是这样:
<xs:complexType name="ExpressionType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="id" type="xs:string" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType>
XJC生成的Java类里,xs:string的文本内容会变成带@XmlValue的value字段,而id属性变成带@XmlAttribute的id字段。要给value字段加注解,需要定位到schema里的xs:simpleContent/xs:extension节点。
解决方案:配置bindings.xjb文件
你只需要在绑定文件里用XPath定位到ExpressionType的simpleContent扩展节点,然后用annox给对应的生成字段加注解即可。
完整的bindings.xjb示例
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:annox="http://annox.dev.java.net" jaxb:version="2.1"> <!-- 指向你的XSD文件 --> <jaxb:bindings schemaLocation="your-schema-file.xsd" node="/xs:schema"> <!-- 定位ExpressionType这个complexType下的simpleContent扩展节点 --> <jaxb:bindings node="xs:complexType[@name='ExpressionType']/xs:simpleContent/xs:extension[@base='xs:string']"> <!-- 给生成的value字段添加XmlJavaTypeAdapter注解 --> <annox:annotate target="field"> <annox:annotate annox:class="javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter" value="com.yourpackage.YourCustomAdapter.class"/> </annox:annotate> </jaxb:bindings> </jaxb:bindings> </jaxb:bindings>
关键说明
- XPath定位逻辑:
xs:complexType[@name='ExpressionType']/xs:simpleContent/xs:extension[@base='xs:string']精准指向了simpleContent扩展的核心节点,这个节点对应的就是XJC生成的@XmlValue修饰的value字段。 - target="field":明确指定注解要添加到生成的字段上(如果需要加到getter方法上,可以改成
target="getter")。 - 命名空间声明:确保配置文件里包含了jaxb、xs、annox的命名空间,否则XPath和注解会失效。
验证结果
配置完成后,运行XJC生成代码,你会看到ExpressionType类的value字段已经带上了@XmlJavaTypeAdapter(YourCustomAdapter.class)注解,和你预期的一致。
内容的提问来源于stack exchange,提问作者rainer198
相关产品推荐
相关产品推荐

