Java把WSDL文件转换成服务器,本质是反向生成服务端代码:用Apache CXF的wsdl2java -server或JDK的wsimport生成SEI与骨架,再实现业务方法、部署到Tomcat或Jetty。 WSDL只是接口契约,转换出来的不是现成服务器,而是需要你补逻辑的Java工程。
WSDL到Java服务端,先搞懂转换的本质
WSDL描述契约,不是可执行程序
WSDL是XML格式的Web服务描述语言,定义端口、操作、消息和绑定,它只告诉你“服务长什么样”,不包含业务逻辑,把WSDL转成服务器,实际是生成服务端接口和实现骨架。
正向与反向的差别
- 正向开发:先写Java接口,加@WebService注解,容器自动生成WSDL。
- 反向生成:已有WSDL,用工具生成Java接口和骨架,再补实现类。
- 遗留系统集成、第三方对接场景,多数走反向路线。
java wsimport生成服务端代码详细步骤
确认JDK版本与wsimport可用性
据Oracle官方文档,JDK 8自带wsimport;JDK 11及以上已移除,需要单独引入JAX-WS RI或改用CXF,命令行输入wsimport -version检查,如果提示找不到命令,建议直接上CXF。
基础命令与参数解释
wsimport -keep -s src/main/java -d target/classes -p com.example.service http://localhost:8080/HelloService?wsdl
-keep保留生成源文件-s指定源目录-d指定class输出目录-p指定包名
wsimport默认生成客户端调用类,服务端接口是PortType对应的SEI,你需要自己写实现类,加@WebService(endpointInterface="...")。
生成后如何改成服务端
- 找到生成的接口,例如
HelloServicePortType。 - 创建实现类
HelloServiceImpl implements HelloServicePortType。
- 用
Endpoint.publish("http://0.0.0.0:8080/hello", new HelloServiceImpl())发布。 - 或者打成war包,配置
web.xml和sun-jaxws.xml部署到Tomcat。
cxf wsdl2java反向生成服务端和客户端哪个更实用
服务端模式与客户端模式对比
| 模式 | 命令参数 | 适用场景 | |
|---|---|---|---|
| 服务端 | -server -impl | SEI + 实现骨架 | 已有WSDL,要建服务端 |
| 客户端 | -client | 代理类 + SEI | 调用第三方服务 |
| 两者 | 不指定 | 默认客户端 | 集成测试 |
业内共识认为,反向生成服务端时,CXF的-server比wsimport更省事,因为直接给出实现类骨架。
Maven插件实操
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>3.5.5</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>${project.build.directory}/generated-sources/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>src/main/resources/HelloService.wsdl</wsdl>
<extraargs>
<extraarg>-server</extraarg>
<extraarg>-impl</extraarg>
</extraargs>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals><goal>wsdl2java</goal></goals>
</execution>
</executions>
</plugin>
运行mvn generate-sources,生成到target/generated-sources/cxf。
补全业务逻辑与启动
生成的Impl.java里,每个方法默认抛出UnsupportedOperationException,你填入真实逻辑,然后可以用Jetty启动:
HelloServiceImpl impl = new HelloServiceImpl();
Server server = new Server(8080);
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setServiceClass(HelloServiceImpl.class);
factory.setAddress("/hello");
factory.create();
或者打包war,用CXF的Servlet配置。
在Linux环境下根据wsdl生成java服务端代码怎么做
命令行操作与权限注意
Linux下与Windows命令基本一致,但要注意:
- 确保有写权限:
chmod -R 755 /opt/project - 使用绝对路径避免找不到WSDL
- 如果WSDL在远程URL,用curl或wget先下载到本地,提高生成稳定性
curl -o HelloService.wsdl http://remote:8080/HelloService?wsdl /path/to/apache-cxf/bin/wsdl2java -server -impl -d src/main/java -p com.example.service HelloService.wsdl
常见报错与解决
- 报错“Could not find wsdlLocation”:检查路径,用
file:///绝对路径。 - 报错“端口被占用”:发布时换端口。
- 生成代码中文乱码:加
-encoding UTF-8。 - 缺少依赖:Maven中引入
cxf-rt-frontend-jaxws、cxf-rt-transports-http。
根据wsdl生成java服务端代码需要付费吗
免费方案足够企业使用
JDK自带wsimport免费,Apache CXF开源免费,Axis2也是Apache项目,IDEA社区版没有Web服务生成向导,但可以用命令行或Maven插件,商业IDE如IntelliJ IDEA Ultimate提供图形化向导,但核心生成能力来自开源工具,行业共识认为,中小项目完全可以用免费组合完成。
成本主要在人力与维护
真正花钱的地方是:
- 理解WSDL中的复杂类型和策略
- 处理WS-Security、附件、异步调用
- 代码生成后的适配和测试
这些与工具是否收费关系不大。
Q&A:java怎么把wsdl文件转换成服务器实战答疑
Q1:WSDL转成服务端后,必须用Tomcat部署吗?
不是必须,可以用Endpoint.publish()直接发布一个轻量HTTP服务,适合测试,生产环境常用Tomcat、Jetty、Undertow或Spring Boot内嵌容器,如果已有Spring Boot,引入cxf-spring-boot-starter-jaxws,配置ServletRegistrationBean即可。
Q2:生成的代码里有很多@XmlType和@XmlElement,需要手动改吗?
多数情况下不需要,这些是JAXB根据WSDL的XSD生成的映射注解,只有当WSDL包含特殊命名空间或冲突元素时,才用JAXB绑定文件(.xjb)自定义,修改生成代码后,下次重新生成会被覆盖,建议把业务逻辑写在单独的实现类里。
Q3:WSDL文件很大,生成服务端代码总是内存溢出怎么办?
增加JVM堆内存,例如export MAVEN_OPTS="-Xmx2048m",如果是CXF的wsdl2java,可以加-fe jaxws21或-fe jaxws切换前端,把WSDL拆分为多个小文件,或用-wsdlLocation指定相对路径减少解析负担,如果仍失败,考虑用Axis2的wsdl2java,它对大WSDL的容忍度较高,但生成风格偏旧。
把WSDL转成Java服务端,关键不是“转”这个动作,而是选对生成工具、补全业务实现、再放到容器里运行,CXF的wsdl2java -server适合多数反向场景,wsimport适合已有JAX-WS环境,按上面步骤走,你能得到一个可调试的服务端骨架。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/745761.html





