使用CXF發布WebService簡單又快速,還可以與Spring集成,當Web容器啟動時一起發布WebService服務。本例是簡單的客戶端給服務端發送訂單信息,服務端返回訂單轉為json的字符串。
1.使用maven管理jar包,首先在maven添加使用到的cxf jar包依賴,到CXF官網上找到Maven的依賴內容。
網址如下:http://cxf.apache.org/docs/using-cxf-with-maven.html
我使用的是Tomcat所以引用前兩項就可以了
<properties> <cxf.version>2.2.3</cxf.version> </properties>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
其它jar包依賴
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.32</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
2.創建簡單的訂單類:
package com.ken.model;
import java.io.Serializable;
public class Order implements Serializable {
private String OrderNo;
private String itemCode;
private String itemName;
private Long quantity;
public String getOrderNo() {
return OrderNo;
}
public void setOrderNo(String orderNo) {
OrderNo = orderNo;
}
public String getItemCode() {
return itemCode;
}
public void setItemCode(String itemCode) {
this.itemCode = itemCode;
}
public String getItemName() {
return itemName;
}
public void setItemName(String itemName) {
this.itemName = itemName;
}
public Long getQuantity() {
return quantity;
}
public void setQuantity(Long quantity) {
this.quantity = quantity;
}
}
3.WebService接口及實現類:
3.1接口
package com.ken.webservice;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
import com.ken.model.Order;
@WebService
public interface IRemoteService {
public String showRemoteMessage(@WebParam(name="arg0") String message);
public String addOrder(List<Order> orders);
}
3.2接口實現類
package com.ken.webservice.impl;
import java.util.List;
import javax.jws.WebService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.ken.model.Order;
import com.ken.webservice.IRemoteService;
@WebService(endpointInterface="com.ken.webservice.IRemoteService") //endpointInterface這個不能寫錯了
public class RemoteServiceImpl implements IRemoteService {
public String showRemoteMessage(String message) {
return "You message is "+ message;
}
public String addOrder(List<Order> orders) {
return JSONArray.toJSONString(orders,true);
}
}
4.配置Spring-context.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath*:META-INF/cxf/cxf.xml" />
<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />
<jaxws:endpoint id="remoteServiceEndPoint" implementor="com.ken.webservice.impl.RemoteServiceImpl" address="/RemoteService"></jaxws:endpoint>
</beans>
5.配置web.xml文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
完成上面的步驟后就可以啟動Tomcat並訪問

wsdl:
http://localhost:8080/IHealth.Web/services/RemoteService?wsdl
6.客戶端調用服務
cmd到其項目的src目錄並執行命令就會解析生成相應的調用代碼,命令:wsimport -keep http://localhost:8080/IHealth.Web/services/RemoteService?wsdl

生成好刷新下src目錄就會看到生成的代碼,如下
此時就可以寫調用代碼了:
package com.ken.client;
import java.util.ArrayList;
import java.util.List;
import com.ken.webservice.Order;
import com.ken.webservice.impl.IRemoteService;
import com.ken.webservice.impl.RemoteServiceImplService;
public class Client {
public static void main(String[] args) {
//創建一個用於產生RemoteServiceImplService實例的工廠,RemoteServiceImplService類是wsimport工具生成的
RemoteServiceImplService factory = new RemoteServiceImplService();
//通過工廠生成一個IRemoteService實例,IRemoteService是wsimport工具生成的
IRemoteService service = factory.getRemoteServiceImplPort();
String result = service.showRemoteMessage("Ken");
System.out.println(result);
List<Order> orders = new ArrayList<Order>();
Order order1 = new Order();
order1.setOrderNo("201706048888");
order1.setItemCode("A10000001");
order1.setItemName("IPHONE");
order1.setQuantity(100L);
orders.add(order1);
Order order2 = new Order();
order2.setOrderNo("201706048888");
order2.setItemCode("A10000002");
order2.setItemName("MAC");
order2.setQuantity(200L);
orders.add(order2);
String resultOrder = service.addOrder(orders);
System.out.println(resultOrder);
}
}
運行后控制台內容:
You message is Ken
[
{
"itemCode":"A10000001",
"itemName":"IPHONE",
"orderNo":"201706048888",
"quantity":100
},
{
"itemCode":"A10000002",
"itemName":"MAC",
"orderNo":"201706048888",
"quantity":200
}
]
