升级cxf-codegen-plugin至4.0.3后生成代码结构异常咨询
问题:CXF-codegen-plugin升级至4.0.3后代码生成异常
现象描述
使用cxf-codegen-plugin从WSDL生成Java代码时,版本差异导致生成结构和内容异常:
- 3.5.5版本生成结构:
- generated-sources
- cxf
- com.example
- dxl.gr.ws.client.customeragreement
- group
- com.example
- cxf
- generated-sources
- 4.0.3版本生成结构(未修改WSDL):
- generated-sources
- cxf
- com.example
- group
不仅缺失了dxl.gr.ws.client.customeragreement目录,生成的类还存在代码缺失。
- group
- com.example
- cxf
- generated-sources
插件配置
<plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <executions> <execution> <id>generate-sources</id> <phase>generate-sources</phase> <configuration> <sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot> <wsdlOptions> <wjsdlOption> <wsdl>${project.basedir}/src/main/resources/CustomerAgreementVBS/WSDL/CustomerAgreementVBS.wsdl</wsdl> <wsdlLocation>CustomerAgreementVBS/WSDL/CustomerAgreementVBS.wsdl</wsdlLocation> <extraargs> <extraarg>-b</extraarg> <extraarg>${project.basedir}/src/main/resources/CustomerAgreementVBS/WSDL/service_mapping.xml </extraarg> </extraargs> <extendedSoapHeaders>true</extendedSoapHeaders> </wjsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin>
绑定文件(service_mapping.xml)内容
<?xml version="1.0"?> <jaxws:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="CustomerAgreementVBS.wsdl" xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"> <jaxws:bindings node="wsdl:definitions"> <jaxws:package name="com.example.dxl.gr.ws.client.customeragreement"/> <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping> <handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> <handler-chain> </handler-chain> </handler-chains> </jaxws:bindings> </jaxws:bindings>
原因分析与解决建议
核心原因
- 配置拼写错误:插件配置里的
<wjsdlOption>是笔误,正确应为<wsdlOption>。3.5.5版本对该错误容错性较高,仍能解析配置;但4.0.3版本校验更严格,导致绑定文件参数未被加载,包名配置失效,本该生成到指定包的代码未生成。 - Jakarta EE命名空间兼容问题:CXF 4.x基于Jakarta EE API(替代原Java EE),绑定文件中使用的旧Java EE命名空间(
http://java.sun.com/xml/ns/jaxws、http://java.sun.com/xml/ns/javaee)已被弃用,4.0.3版本可能忽略这些旧命名空间下的配置,导致包名映射不生效。 - 默认行为变更:CXF 4.x的
wsdl2java工具默认生成策略有调整,结合上述配置问题,最终导致部分代码缺失。
解决步骤
- 修正插件配置拼写错误:将
<wjsdlOption>改为<wsdlOption>; - 更新绑定文件命名空间:
<?xml version="1.0"?> <jaxws:bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" wsdlLocation="CustomerAgreementVBS.wsdl" xmlns:jaxws="https://jakarta.ee/xml/ns/jaxws"> <jaxws:bindings node="wsdl:definitions"> <jaxws:package name="com.example.dxl.gr.ws.client.customeragreement"/> <jaxws:enableAsyncMapping>true</jaxws:enableAsyncMapping> <handler-chains xmlns="https://jakarta.ee/xml/ns/javaee"> <handler-chain> </handler-chain> </handler-chains> </jaxws:bindings> </jaxws:bindings> - 清理并重新生成:执行
mvn clean generate-sources,确保旧生成文件被清理,新配置生效。
内容的提问来源于stack exchange,提问作者Muhammad bakr
相关产品推荐
相关产品推荐

