1、添加依賴
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
2又憨、創(chuàng)建實體類
package com.huaxun.springboot.entity;
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = -3628469724795296287L;
private int id;
private String userName;
private String passWord;
private String userSex;
private String nickName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
3翠霍、創(chuàng)建service接口
package com.huaxun.springboot.service;
import com.huaxun.springboot.entity.User;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService
public interface UserService {
@WebMethod//標注該方法為webservice暴露的方法,用于向外公布,它修飾的方法是webservice方法蠢莺,去掉也沒影響的寒匙,類似一個注釋信息。
public User getUser(@WebParam(name = "userId") String userId);
@WebMethod
@WebResult(name="String",targetNamespace="")
public String getUserName(@WebParam(name = "userId") String userId);
}
4躏将、創(chuàng)建接口實現(xiàn)類
package com.huaxun.springboot.service;
import com.huaxun.springboot.entity.User;
import org.springframework.stereotype.Component;
import javax.jws.WebService;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@WebService(serviceName="userService",//對外發(fā)布的服務名
targetNamespace="http://service.demo.example.com",//指定你想要的名稱空間锄弱,通常使用使用包名反轉(zhuǎn)
endpointInterface="com.huaxun.springboot.service.UserService")
@Component
public class UserServiceImpl implements UserService{
private Map<String, User> userMap = new HashMap<String, User>();
public UserServiceImpl() {
System.out.println("向?qū)嶓w類插入數(shù)據(jù)");
User user = new User();
user.setId(111);
user.setUserName("test1");
userMap.put(user.getId()+"", user);
user = new User();
user.setId(112);
user.setUserName("test2");
userMap.put(user.getId()+"", user);
user = new User();
user.setId(113);
user.setUserName("test3");
userMap.put(user.getId()+"", user);
}
@Override
public String getUserName(String userId) {
return "userId為:" +userMap.get( userId).getUserName();
}
@Override
public User getUser(String userId) {
System.out.println("userMap是:"+userMap);
return userMap.get(userId);
}
}
5、創(chuàng)建CXF配置類
package com.huaxun.springboot.controller;
import com.huaxun.springboot.service.UserService;
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;
@Configuration
public class CxfConfig {
@Autowired
private Bus bus;
@Autowired
UserService userService;
/**
* 此方法作用是改變項目中服務名的前綴名祸憋,此處127.0.0.1或者localhost不能訪問時会宪,請使用ipconfig查看本機ip來訪問
* 此方法被注釋后:wsdl訪問地址為http://127.0.0.1:8080/services/user?wsdl
* 去掉注釋后:wsdl訪問地址為:http://127.0.0.1:8080/soap/user?wsdl
* @return
*/
@SuppressWarnings("all")
@Bean
public ServletRegistrationBean dispatcherServlet() {
return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
}
/** JAX-WS
* 站點服務
* **/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, userService);
endpoint.publish("/user");
return endpoint;
}
}
6、運行springboot主程序
package com.huaxun.springboot;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
7蚯窥、頁面訪問服務
image.png
如上圖服務部署成功
8狈谊、編寫測試類
第二個測試用到了httpClient,引入相關(guān)依賴
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
測試類代碼
package com.huaxun.springboot;
import com.huaxun.springboot.service.UserService;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.http.HttpResponse;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.apache.http.HttpEntity;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Test.main1();
Test.main2();
}
/**
* 1.代理類工廠的方式,需要拿到對方的接口地址
*/
public static void main1() {
try {
// 接口地址
String address = "http://127.0.0.1:8080/soap/user?wsdl";
// 代理工廠
JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
// 設置代理地址
jaxWsProxyFactoryBean.setAddress(address);
// 設置接口類型
jaxWsProxyFactoryBean.setServiceClass(UserService.class);
// 創(chuàng)建一個代理接口實現(xiàn)
UserService us = (UserService) jaxWsProxyFactoryBean.create();
// 數(shù)據(jù)準備
String userId = "111";
// 調(diào)用代理接口的方法調(diào)用并返回結(jié)果
String result = us.getUserName(userId);
System.out.println("返回結(jié)果:" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 2:httpClient調(diào)用
*/
public static void main2() {
try {
final String SERVER_URL = "http://127.0.0.1:8080/soap/user"; // 定義需要獲取的內(nèi)容來源地址
HttpPost request = new HttpPost(SERVER_URL);
String soapRequestData = getRequestXml();
HttpEntity re = new StringEntity(soapRequestData, HTTP.UTF_8);
request.setHeader("Content-Type","application/soap+xml; charset=utf-8");
request.setEntity(re);
HttpResponse httpResponse = new DefaultHttpClient().execute(request);
if (httpResponse.getStatusLine().getStatusCode() ==200) {
String xmlString = EntityUtils.toString(httpResponse.getEntity());
String jsonString = parseXMLSTRING(xmlString);
System.out.println("---"+jsonString);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String parseXMLSTRING(String xmlString) {
String returnJson = "";
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlString)));
Element root = doc.getDocumentElement();//根節(jié)點
Node node = root.getFirstChild();
while (!node.getNodeName().equals("String")) {
node = node.getFirstChild();
}
if (node.getFirstChild() != null) returnJson = node.getFirstChild().getNodeValue();
System.out.println("獲取的返回參數(shù)為:" + returnJson);
} catch (Exception e) {
e.printStackTrace();
}
return returnJson;
}
private static String getRequestXml(){
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\"?>");
sb.append("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ");
sb.append(" xmlns:sam=\"http://service.springboot.huaxun.com/\" "); //前綴,這一串由服務端提供
sb.append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"");
sb.append(" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");
sb.append("<soap:Header/>");
sb.append("<soap:Body>");
sb.append("<sam:getUserName>"); //“getUserName”調(diào)用方法名
sb.append("<userId>111</userId>"); //傳參,“userId”是配置在服務端的參數(shù)名稱,“111”是要傳入的參數(shù)值
sb.append("</sam:getUserName>");
sb.append("</soap:Body>");
sb.append("</soap:Envelope>");
return sb.toString();
}
}
運行main1()方法結(jié)果如下
image.png
運行main2()方法結(jié)果如下
image.png
至此整合完成