SpringBoot整合WebSerice
说明: WebService是很早以前的技术, 已经比较过时了, WebService在jdk1.8或及以下版本兼容性更好; jdk1.9或及其以上版本, WebService兼容性不太友好, 此笔记基于jdk11
1. WebServiceTest父模块

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zqd</groupId> <artifactId>WebServiceTest</artifactId> <version>1.0-SNAPSHOT</version> <modules> <module>Server</module> <module>Client</module> <module>Common</module> </modules> <packaging>pom</packaging> <name>WebServiceTest Maven Webapp</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> <relativePath/> </parent> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-ri</artifactId> <version>2.3.4</version> <type>pom</type> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.1.5.Final</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> <version>3.4.3</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> <version>3.4.3</version> </dependency> </dependencies> </dependencyManagement> </project>
2. Common子模块

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zqd</groupId> <artifactId>Common</artifactId> <version>1.0-SNAPSHOT</version> <name>Common</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <parent> <groupId>com.zqd</groupId> <artifactId>WebServiceTest</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web-services</artifactId> </dependency> <dependency> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-ri</artifactId> <type>pom</type> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-spring-boot-starter-jaxws</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> </dependency> </dependencies> </project>

package com.zqd.service; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; /** * @author ADeng * @date 2022/5/22 * @desc */ @WebService(name= "MessageService" , targetNamespace = "http://service.zqd.com" ) public interface IMessageService { @WebMethod String echo(@WebParam String msg); }
3. Server子模块

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zqd</groupId> <artifactId>Server</artifactId> <version>1.0-SNAPSHOT</version> <name>Server</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <parent> <groupId>com.zqd</groupId> <artifactId>WebServiceTest</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>com.zqd</groupId> <artifactId>Common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>

package com.zqd; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * 启动后访问: http://localhost:8080/services */ @SpringBootApplication public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } }

package com.zqd.service; import org.springframework.stereotype.Service; import javax.jws.WebService; /** * @author ADeng * @date 2022/5/22 * @desc */ @WebService(serviceName= "MessageService" , targetNamespace = "http://service.zqd.com" , endpointInterface = "com.zqd.service.IMessageService" ) @Service public class MessageServiceImpl implements IMessageService { @Override public String echo(String msg) { return "[ECHO] : " + msg; } }

package com.zqd.interceptor; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.springframework.stereotype.Component; import org.w3c.dom.NodeList; import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPMessage; /** * @author ADeng * @date 2022/5/22 * @desc */ @Component public class WebServiceAuthInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private static final String USER_NAME = "qzeng"; private static final String USER_PASSWORD = "123"; private SAAJInInterceptor saa = new SAAJInInterceptor(); // 创建拦截器 public WebServiceAuthInterceptor() { super(Phase.PRE_PROTOCOL); super.getAfter().add(SAAJInInterceptor.class.getName()); // 添加拦截 } @Override public void handleMessage(SoapMessage message) throws Fault { SOAPMessage soapMessage = message.getContent(SOAPMessage.class); if (soapMessage == null) { // 没有消息内容 this.saa.handleMessage(message); // 直接走默认处理 soapMessage = message.getContent(SOAPMessage.class); } SOAPHeader header; try { header = soapMessage.getSOAPHeader(); } catch (SOAPException e) { throw new Fault(new IllegalAccessException("找不到header信息,无法实现用户认证处理")); } NodeList usernameNodeList = header.getElementsByTagName("username"); NodeList passwordNodeList = header.getElementsByTagName("password"); if (usernameNodeList.getLength() < 1 || passwordNodeList.getLength() < 1) { throw new Fault(new IllegalAccessException("找不到Header信息, 无法实现永固认证处理")); } String username = usernameNodeList.item(0).getTextContent().trim(); String password = passwordNodeList.item(0).getTextContent().trim(); System.out.println("username = " + username + ", password = " + password); if (USER_NAME.equals(username) && USER_PASSWORD.equals(password)) { System.out.println("用户认证成功"); } else { SOAPException soapException = new SOAPException("用户认证失败"); System.out.println("用户认证失败"); throw new Fault(soapException); } } }

package com.zqd.config; import com.zqd.interceptor.WebServiceAuthInterceptor; import com.zqd.service.IMessageService; import org.apache.cxf.Bus; import org.apache.cxf.jaxws.EndpointImpl; import org.apache.cxf.transport.servlet.CXFServlet; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.xml.ws.Endpoint; /** * @author ADeng * @date 2022/5/22 * @desc */ @Configuration public class CXFConfig { @Autowired private Bus bus; @Autowired private IMessageService messageService; @Autowired private WebServiceAuthInterceptor webServiceAuthInterceptor; @Bean public ServletRegistrationBean getRegistrationBean() { return new ServletRegistrationBean(new CXFServlet(), "/services/*"); } @Bean public Endpoint messageEndpoint() { EndpointImpl endpoint = new EndpointImpl(this.bus, this.messageService); endpoint.publish("/MessageService"); endpoint.getInInterceptors().add(this.webServiceAuthInterceptor); return endpoint; } }
4. Client子模块

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zqd</groupId> <artifactId>Client</artifactId> <version>1.0-SNAPSHOT</version> <name>Client</name> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <parent> <groupId>com.zqd</groupId> <artifactId>WebServiceTest</artifactId> <version>1.0-SNAPSHOT</version> </parent> <dependencies> <dependency> <groupId>com.zqd</groupId> <artifactId>Common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>

package com.zqd.interceptor; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.headers.Header; import org.apache.cxf.helpers.DOMUtils; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; import org.w3c.dom.Document; import org.w3c.dom.Element; import javax.xml.namespace.QName; import java.util.List; /** * @author ADeng * @date 2022/5/22 * @desc */ public class ClientLoginInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private String username; private String password; public ClientLoginInterceptor(String username, String password) { super(Phase.PREPARE_SEND); this.username = username; this.password = password; } @Override public void handleMessage(SoapMessage soapMessage) throws Fault { List<Header> headerList = soapMessage.getHeaders(); Document document = DOMUtils.createDocument(); Element auth = document.createElement("authority"); Element username = document.createElement("username"); Element password = document.createElement("password"); username.setTextContent(this.username); password.setTextContent(this.password); auth.appendChild(username); auth.appendChild(password); headerList.add(0, new Header(new QName("authority"), auth)); } }

package com.zqd.client; import com.zqd.interceptor.ClientLoginInterceptor; import com.zqd.service.IMessageService; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; /** * @author ADeng * @date 2022/5/22 * @desc 方式一: 代理方式调用 */ public class CXFClientProxy { public static void main(String[] args) { String url = "http://localhost:8080/services/MessageService?wsdl"; JaxWsProxyFactoryBean proxy = new JaxWsProxyFactoryBean(); proxy.setAddress(url); proxy.setServiceClass(IMessageService.class); proxy.getOutInterceptors().add(new ClientLoginInterceptor("qzeng", "123")); IMessageService messageService = (IMessageService) proxy.create(); String message = "hello world zqd"; String result = messageService.echo(message); System.out.println(result); } }

package com.zqd.client; /** * @author ADeng * @date 2022/5/22 * @desc 方式二: 动态模式来调用 */ import com.zqd.interceptor.ClientLoginInterceptor; import org.apache.cxf.endpoint.Client; import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory; public class CXFClientDynamic { public static void main(String[] args) throws Exception { String url = "http://localhost:8080/services/MessageService?wsdl"; // WebService服务地址 JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(); Client client = dcf.createClient(url); // 创建一个客户端类 client.getOutInterceptors().add(new ClientLoginInterceptor("qzeng", "123")); String message = "hello world zqd"; Object[] result = client.invoke("echo", message); System.out.println(result[0]); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix