Axis2迁移至CXF时自定义枚举类名称配置不生效问题求助
嘿,我之前也踩过类似的坑!你遇到的这个问题大概率是几个细节没配置到位,我给你梳理几个排查和解决的方向:
先确认绑定文件的XPath节点匹配是否准确
你写的xs:simpleType[@name='my_Enum_Name']可能因为命名空间问题没命中目标枚举类型。如果你的XSD文件有targetNamespace,绑定文件里得先声明对应的命名空间前缀,再用前缀定位节点。举个实际例子,如果XSD的目标命名空间是http://your-company.com/your-schema,绑定文件得这么写:<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://your-company.com/your-schema"> <jxb:bindings schemaLocation="你的XSD文件路径.xsd"> <jxb:bindings node="//tns:simpleType[@name='my_Enum_Name']"> <jxb:typesafeEnumClass name="MY_ENUM_NAME"/> </jxb:bindings> </jxb:bindings> </jxb:bindings>这里用
//tns:simpleType是为了跨层级匹配,避免因为节点嵌套深度问题导致匹配失败。检查CXF代码生成插件是否正确加载了绑定文件
如果你用Maven的cxf-codegen-plugin,一定要确保在配置里正确指定了绑定文件路径,比如:<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>你的CXF版本号</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <goals> <goal>wsdl2java</goal> </goals> <configuration> <wsdlOptions> <wsdlOption> <wsdl>你的WSDL文件路径.wsdl</wsdl> <bindingFiles> <bindingFile>你的绑定文件路径.xjb</bindingFile> </bindingFiles> </wsdlOption> </wsdlOptions> </configuration> </execution> </executions> </plugin>要是插件没正确加载绑定文件,你的自定义配置自然不会生效。
排查是否被CXF默认命名策略覆盖
CXF默认的命名转换规则会自动移除下划线,要是前面两个方法都没用,你可以试试自定义命名处理器。不过这个步骤稍复杂,先把前两个排查完再考虑这个——比如实现org.apache.cxf.tools.common.NameProcessor接口,或者调整CXF默认的命名处理参数。
另外,你可以先试试用纯JAXB的xjc命令生成代码,看看自定义枚举名称能不能生效。如果xjc能生成正确的MY_ENUM_NAME,那问题肯定出在CXF的插件配置上;如果xjc也不行,那就是绑定文件本身的写法有问题,得再调整XPath或命名空间配置。
内容来源于stack exchange

