1. 程式人生 > >【CXF】- Spring 整合 webservice CXF

【CXF】- Spring 整合 webservice CXF

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

webservice服務端

專案程式碼層次結構:

①:web.xml:CXFServlet/Spring配置檔案資訊

context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:beans.xml</param-value>
  </context-param>
  
  <!-- web容器啟動時載入配置的xml檔案 -->
  <listener>
      <listener-class> 
      org.springframework.web.context.ContextLoaderListener 
      </listener-class>
  </listener>
  
  <!-- 配置CXF框架 -->
  <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>/*</url-pattern>
   </servlet-mapping>

②:spring整合CXF框架配置:beans.xml

<!-- 引cxf的一些核心配置 -->
<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" />
    
<!-- 
配置webservice的終端介面:
id:唯一的識別碼
implementor:webservice介面的實現類
address:web訪問的地址:http://localhost:8080/webservice_spring_server/orderws?wsdl
-->
<jaxws:endpoint  id="orderWS" implementor="com.zhiwei.ws.service.OrderWSImp"  address="/orderws">
     
<!-- 配置伺服器的出攔截器 -->
<jaxws:inInterceptors>
<bean class="com.zhiwei.ws.interceptor.ServerInterceptor"/>
</jaxws:inInterceptors>

③:webservice服務介面/服務類/攔截器/POJO

package com.zhiwei.ws.inter;

import javax.jws.WebMethod;
import javax.jws.WebService;
import com.zhiwei.domain.Order;

@WebService
public interface OrderWS {

	@WebMethod
	public Order getOrderById(int id);
}
package com.zhiwei.ws.service;

import javax.jws.WebService;
import com.zhiwei.domain.Order;
import com.zhiwei.ws.inter.OrderWS;

@WebService
public class OrderWSImp implements OrderWS {

	
	//SEI實現類由spring容器管理,自動例項化載入
	public OrderWSImp() {
		System.out.println("webserviceIMP被建立.......");
	}

	public Order getOrderById(int id) {
		System.out.println("getOrderById is running!");
		return new Order(id, "squirrel", 200.5);
	}

}
package com.zhiwei.ws.interceptor;

import java.util.List;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;

public class ServerInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
 
   	
	public ServerInterceptor() {
		super(Phase.PRE_PROTOCOL);	
	}
   
	//<head> <name>zhiwei<name> </head>
	public void handleMessage(SoapMessage msg) throws Fault {
		
		//獲取檔案頭
		List<Header> headers=msg.getHeaders();
		SoapHeader header=(SoapHeader) headers.get(0);
	    Element element=(Element) header.getObject();
	    String name=element.getElementsByTagName("name").item(0).getTextContent();
	    
	    if("xiaoyang".equals(name)) {
	    	 System.out.println("Server interceptor.........."+name);	
	    	 return;
	    }
	   throw new Fault(new RuntimeException("使用者名稱不正確!"));
	
	}
}
package com.zhiwei.domain;

public class Order {
	
	private int id;
	private String name;
	private double price;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getPrice() {
		return price;
	}
	public void setPrice(double price) {
		this.price = price;
	}
	public Order(int id, String name, double price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
	@Override
	public String toString() {
		return "Order [id=" + id + ", name=" + name + ", price=" + price + "]";
	}
}

客戶端程式碼層次結構:客戶端程式碼採用CXF的wsdl2java工具生成

④:客戶端spring配置:client-beans.xml

<jaxws:client id="orderClient" 
serviceClass="com.zhiwei.ws.service.OrderWS" 
address="http://localhost:8080/webservice_spring_server/orderws">
	
	<!-- 配置客戶端的出攔截器 -->
<jaxws:outInterceptors>
<bean class="com.zhiwei.ws.interceptor.ClientInterceptor">
<	constructor-arg name="name" value="xiaoyang"/>
</bean>
</jaxws:outInterceptors>
</jaxws:client>

⑤:客戶端測試

//獲取客戶端配置檔案
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("client-beans.xml");

//獲取spring容器裡面的bean
OrderWS orderWS=(OrderWS) context.getBean("orderClient");

//通過webservice代理呼叫webservice方法
Order order=orderWS.getOrderById(1);
System.out.println("--->"+order.toString());

客戶端日誌:

服務端日誌:

至此Spring整合CXF框架完成