寻求仅依赖Jakarta包的@WebService示例及Java11/Tomcat10下SOAP服务绑定解决方案
我完全懂你迁移时的这种头疼——从Java8/Tomcat8转到Java11/Tomcat10,SOAP服务这块因为Jakarta EE的命名空间彻底替换,之前的配置套路全不管用了,而且找纯Jakarta的示例确实费劲。下面给你一套完整的纯Jakarta依赖的@WebService实现方案,以及Tomcat10下的绑定配置要点:
1. 纯Jakarta的@WebService服务实现类
所有注解和依赖都只用Jakarta包,完全摒弃javax相关内容:
package com.example.soap; import jakarta.jws.WebMethod; import jakarta.jws.WebService; // 指定服务的命名空间和服务名称 @WebService(targetNamespace = "http://example.com/soap", serviceName = "HelloService") public class HelloServiceImpl { // 定义SOAP接口方法 @WebMethod(operationName = "sayHello") public String sayHello(String name) { return "Hello, " + name + "! From Jakarta EE SOAP Service"; } }
2. Maven依赖与插件配置
确保pom.xml里的依赖都是Jakarta版本,同时配置wsgen插件生成相关文件:
依赖配置
Tomcat10自带基础的Jakarta API,但JAX-WS的运行时需要额外引入,这里建议把运行时依赖打包到WAR里(如果不想放到Tomcat全局lib的话):
<dependencies> <!-- Jakarta JAX-WS API,Tomcat10已提供,设为provided --> <dependency> <groupId>jakarta.xml.ws</groupId> <artifactId>jakarta.xml.ws-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <!-- JAX-WS运行时实现,需要打包到WAR中 --> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-rt</artifactId> <version>3.0.1</version> </dependency> </dependencies>
wsgen插件配置
使用支持Jakarta的新版jaxws-maven-plugin来生成WSDL和相关绑定文件:
<build> <plugins> <plugin> <groupId>org.jvnet.jax-ws-commons</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <goals> <goal>wsgen</goal> </goals> <configuration> <!-- 指定你的服务实现类全路径 --> <sei>com.example.soap.HelloServiceImpl</sei> <!-- 自动生成WSDL文件 --> <genWsdl>true</genWsdl> <!-- 目标Jakarta EE版本 --> <target>3.0</target> </configuration> </execution> </executions> </plugin> </plugins> </build>
3. Tomcat10下的部署与绑定要点
废弃sun-jaxws.xml配置
Tomcat10不再支持原有的com.sun.xml.ws.transport.http.servlet.WSServletContextListener,也不需要sun-jaxws.xml来绑定URL了——只要你的服务类加了@WebService注解,Tomcat10会自动扫描并注册服务。
确保web.xml使用Jakarta命名空间
如果你的项目还保留web.xml,必须替换成Jakarta的命名空间,否则容器无法识别注解:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <!-- 这里不需要任何SOAP相关的listener或servlet配置 --> </web-app>
4. 测试访问
部署WAR包到Tomcat10后,你可以通过以下地址访问WSDL:http://localhost:8080/你的应用上下文/HelloService?wsdl
比如你的应用上下文是soap-demo,那完整地址就是http://localhost:8080/soap-demo/HelloService?wsdl。
你可以用SOAPUI、Postman或者curl工具来调用sayHello方法,验证服务是否正常响应。
常见问题排查
- 如果访问WSDL时404,检查:
- WAR包是否正确部署,应用上下文是否正确
- 服务类的包路径是否正确,
@WebService注解是否配置正确 - jaxws-rt的依赖是否已打包到WAR的WEB-INF/lib目录中
备注:内容来源于stack exchange,提问作者Dave

