CXF應用過程

@北京漢庭,唉

按照http://www.cnblogs.com/hoojo/archive/2011/03/29/1998856.html中描述的完成了helloworld練習,攔截器練習,傳輸複雜對象練習,spring整合webservice練習(只是整合了server,client到時根據請求地址自動生成代碼)。

現在我需要在兩個項目間進行互相調用接口練習。

預定在a項目和b項目之間進行,首先把cxf必須用到的三個jar包放入lib中(XmlSchema-1.4.7.jar,wsdl4j-1.6.2.jar,cxf-2.3.3.jar),然後在web.xml中加入cxf的servlet;最後新建一個applicationContext-server.xml配置文件來整合sping和cxf。

第一步:實現兩個項目之間的通信;

第二步:互相調用webservice更新對方的數據庫;

第三步:根據返回值給出提示。

 

記錄:

如果web.xml文件中,cxfservlet的url-partten寫成/*的話,項目裏所有的請求都會被過濾掉,只有webservice的才能被正確響應

所以,這裏我改成了/webservice/*,

 

 <!-- 接口整合 -->
  <servlet>
  <servlet-name>CXFService</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>CXFService</servlet-name>
  <url-pattern>/webservice/*</url-pattern>
  </servlet-mapping>

但是在spirng整合文件中的address沒有變化(文章最下面會給出完整配置文件):

<jaxws:serverid="t303Service"serviceClass="com.cxf.server.IWST303"address="/wst303">

最後請求的路徑爲:http://localhost:8081/a項目/webservice/wst303?wsdl

 

如果需要調用接口更新數據,那麼還要進行事物管理。

最開始,我只是給service加了註解,

@WebService
@SOAPBinding(style=Style.RPC)
@Service  加了這個註解
public class WST303 implements IWST303{
         @Resource(name = "t303DaoImpl") // 注入DAO
         T303Dao t303Dao;
        
         public String updateT303(@WebParam(name="myid")String id,@WebParam(name="level")String level){
                   T303 t303 = t303Dao.get(id);
                   t303.setLevel(level);
                   t303Dao.update(t303);
                   return "Y";
         }
}
 

後來發現調用接口可以正常進這個方法體,但是走到根據ID取值的時候就報了這個異常:

No Hibernate Session boundto thread, and configuration does not allow creat

 

到網上查了很多,但是都沒用針對我這個情況的。最後我把這個類繼承了a項目裏面的一個基類,發現可以正常調用接口並修改數據了。

@WebService
@SOAPBinding(style=Style.RPC)
@Service 
public class WST303 extends BaseServiceImpl<T303, String> implements IWST303{

接口類也加了這麼一段:

@WebService
public interface IWST303  extends BaseService<T303, String>

好是好了,但知其然不知其所以然,這是不行的,爲啥繼承了基類就可以正常調用了呢?


後來我在基類發現了這麼個東西:

@Transactional  // 註冊事物

public class BaseServiceImpl

 

現在明白了,最後的代碼爲:

@WebService
public interface IWST303…
 
@WebService
@SOAPBinding(style=Style.RPC)
@Transactional
public class WST303  implements IWST303…

測試通過!

 

後記:

開發完成了webservice接口,後面的就是調試客戶端了,客戶端的代碼相對簡單,大部分可以自動生成,只是調用的地方需手動寫。

 

然後點finish就生成了客戶端的代碼,



然後新建一個類(不新建也可),調用我定義的那個ws接口:

         public String updateT303(String id,Stringlevel){
                  
                   IWST303ServiceLocator serviceLocator = new IWST303ServiceLocator();
                   IWST303 service ;
                   try {
                            service=  serviceLocator.getIWST303Port();
                            return service.updateT303(id, level);
                   } catch (ServiceException e) {
                            e.printStackTrace();
                   } catch (RemoteException e) {
                            e.printStackTrace();
                   }
                   return null;
         }

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

spring整合CXF配置文件:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	   xmlns="http://www.springframework.org/schema/beans" 
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:jaxws="http://cxf.apache.org/jaxws" <!-- webservice整合必須 -->
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-2.5.xsd
       http://cxf.apache.org/jaxws
       http://cxf.apache.org/schemas/jaxws.xsd">
        <!-- 導入webservice整合必須的三個默認配置文件,雖然最終我也沒找到這三個玩意在哪 -->
	<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"/>
	
	<bean id="t303ServiceBean" class="com.veivo.ppq.webservice.server.WST303" />
	
	<bean id="inMessageInterceptor" class="com.veivo.ppq.webservice.server.MessageInterceptor" >
		<constructor-arg><value>receive</value></constructor-arg>
	</bean>
	
	<bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />

	<!-- 注意下面的address,這裏的address的名稱就是訪問的WebService的name -->
	<jaxws:server id="t303Service" serviceClass="com.veivo.ppq.webservice.server.IWST303" address="/wst303">
		<jaxws:serviceBean>
			<!-- 要暴露的 bean 的引用 -->
			<ref bean="t303ServiceBean" />
		</jaxws:serviceBean>
		<jaxws:inInterceptors>
			<ref bean="inMessageInterceptor" />
		</jaxws:inInterceptors>
		<jaxws:outInterceptors>
			<ref bean="outLoggingInterceptor" />
		</jaxws:outInterceptors>
	</jaxws:server>

</beans>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章