如何通过CXF绑定自定义wsdl:port生成的Java字段名?
解决方案:通过CXF绑定文件重命名Port对应的QName字段
当然可以解决!你完全不用修改原始WSDL文件,通过CXF的绑定配置就能自定义生成代码里的port对应的QName字段名,完美避开数字开头的编译错误。下面是具体的实现步骤:
1. 创建自定义绑定文件
新建一个绑定文件(比如命名为bindings.xml),在里面定位到目标wsdl:port节点,指定合法的新名称:
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" version="2.1"> <!-- 关联你的目标WSDL文件 --> <jaxws:bindings wsdlLocation="path/to/your/123xxx.wsdl"> <!-- 定位到名称为"123xxx"的service节点,保持你已有的服务类重命名配置 --> <jaxws:bindings node="wsdl:definitions/wsdl:service[@name='123xxx']"> <jaxb:class name="MyService"/> <!-- 进一步定位到有问题的port节点,重命名其对应的QName字段 --> <jaxws:bindings node="wsdl:port[@name='123xxxHttpSoap11Endpoint']"> <!-- 指定新的合法名称,比如MyHttpSoap11Endpoint --> <jaxws:portName name="MyHttpSoap11Endpoint"/> </jaxws:bindings> </jaxws:bindings> </jaxws:bindings> </jaxws:bindings>
这里的核心是<jaxws:portName>标签:它会替换原始port名称,生成的MyService类里的静态QName字段就会使用你指定的合法名称(比如MyHttpSoap11Endpoint),彻底解决数字开头的编译问题。
2. 在Maven插件中引用绑定文件
修改pom.xml里的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>src/main/resources/your-service.wsdl</wsdl> <!-- 引用刚才创建的绑定文件 --> <bindingFiles> <bindingFile>src/main/resources/bindings.xml</bindingFile> </bindingFiles> </wsdlOption> </wsdlOptions> </configuration> </execution> </executions> </plugin>
3. 执行代码生成
运行mvn generate-sources命令,生成的MyService类里的QName字段就会变成:
public final static QName MyHttpSoap11Endpoint = new QName("http://new.webservice.namespace", "MyHttpSoap11Endpoint");
完全符合Java标识符规范,不会再出现编译错误。
备选方案(如果绑定方式不生效)
如果因为CXF版本差异导致上述配置不生效,还可以尝试用<jaxb:property>标签直接指定字段名,不过针对port的QName,<jaxws:portName>是更直接、更贴合场景的方式。
内容的提问来源于stack exchange,提问作者Michael Zhavzharov
相关产品推荐
相关产品推荐

