和第三方对接,写了个http接口,然后告诉我需要WebService接口;一猜就是老掉牙的项目,还搞这么麻烦的东西,很久很久以前写过,不过已经忘得差不多了,重新熟悉一下,记录一下吧!
一、添加依赖
<!--webService相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.7</version>
</dependency>
二、编写接口和接口实现类
接口
package com.zhh.demo.webservice.service;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* @Description: WebService接口示例
* @Author: zhaoheng
* @CreateTime: 2022-11-10 16:29
*/
@WebService(name = "UserService", // 暴露服务名称
targetNamespace = "http://demo.zhh.com" // 命名空间,随便写,但是客户端需要和这里一致
)
public interface UserService {
/**
* 注解@WebParam 无参数声名的写法
* @param name 姓名
* @param sex 性别
* @return
*/
@WebMethod
String userList(@WebParam(targetNamespace = "http://demo.zhh.com") String name,
@WebParam(targetNamespace = "http://demo.zhh.com") String sex);
/**
* 注解@WebParam 有参数声名的写法
* @param name 姓名
* @param sex 性别
* @return
*/
@WebMethod
String userList2(@WebParam(targetNamespace = "http://demo.zhh.com", name = "name") String name,
@WebParam(targetNamespace = "http://demo.zhh.com", name = "sex") String sex);
}
实现类
package com.zhh.demo.webservice.service.impl;
import com.zhh.demo.webservice.service.UserService;
import lombok.extern.slf4j.Slf4j;
import javax.jws.WebService;
/**
* @Description: iam系统状态维护接口
* @Author: zhaoheng
* @CreateTime: 2022-11-10 16:39
*/
@WebService(serviceName = "UserService", // 与接口的名称一致
targetNamespace = "http://demo.zhh.com", // 与接口中的命名空间一致,一般是接口的包名倒
endpointInterface = "com.zhh.demo.webservice.service.UserService" // 接口地址
)
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public String userList(String name, String sex) {
log.info("userList-入参:{},{}",name,sex);
return "OK";
}
@Override
public String userList2(String name, String sex) {
log.info("userList2-入参:{},{}",name,sex);
return "OK";
}
}
三、配置类
package com.zhh.demo.webservice.config;
import com.zhh.demo.webservice.service.UserService;
import com.zhh.demo.webservice.service.impl.UserServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
/**
* @Description: WebService配置
* @Author: zhaoheng
* @CreateTime: 2022-11-10 16:29
*/
@Configuration
public class WebServiceConfig {
@Bean
public ServletRegistrationBean cxfServlet() {
// url前缀,localhost:8080/demo/ws/user?wsdl
return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
/**
* 业务类注入到容器
*/
@Bean
public UserService iamStateService() {
return new UserServiceImpl();
}
/**
* 注册接口到WebService服务
* @return
*/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), iamStateService());
// url地址,localhost:8080/demo/ws/user?wsdl
endpoint.publish("/user");
return endpoint;
}
}
四、结果展示
4.1 浏览器访问
http://localhost:8080/demo/ws/user?wsdl
4.2 postMan调用
设置Header Content-Type=text/xml
请求体Body xml格式
4.2.1 调用 userList 接口
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<userList xmlns="http://demo.zhh.com"> <!-- 接口名称、namespace和后端对应 -->
<arg0>王婷婷</arg0> <!-- 第1个参数 -->
<arg1>女</arg1> <!-- 第2个参数 -->
</userList>
</soap:Body>
</soap:Envelope>
请求成功。
4.2.2 调用 userList2 接口
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<userList2 xmlns="http://demo.zhh.com"> <!-- 接口名称、namespace和后端对应 -->
<name>李白</name> <!-- 和后端接口参数名称对应 -->
<sex>男</sex>
</userList2>
</soap:Body>
</soap:Envelope>
请求成功。
可以看出,两个接口,一个通过注解声名了接口参数另一个没声名,客户端请求的时候也是不一样的。如果声名了参数,客户端使用对应的参数名称标签就行,否则就需要用arg0、arg1、arg3标签分别表示第一二三个参数。
版权归原作者 Muscleheng 所有, 如有侵权,请联系我们删除。