關於webService中的cxf開發配置
阿新 • • 發佈:2018-12-09
一、CXF兩種傳輸資料的方式: 1. JAX-WS,基於SOAP協議(Simple Object Access Protocol,簡單物件訪問協議),支援xml資料格式 2. JAX-RS,基於HTTP協議,支援xml資料格式或者json資料格式
二、開發步驟:(主要用jax-rs與maven專案整合的開發) 1.ws獨立釋出
第一步:準備服務 a.建jar工程、導座標ws、jetty:內建jetty web伺服器,很小巧,在公司測試,類似的web伺服器還有WebLogic、WebSphere ; b.準備實體類(javaBean),封裝資料 c.準備介面、實現類(提供服務的方法) 第二步:釋出服務 address:網路訪問地址 userService:具體的介面 Endpoint.publish(address, userService); 第三步:呼叫服務 瀏覽器可以呼叫 自己寫java程式作為客戶端可以呼叫
2.ws和Spring整合
第一步:準備服務 建war工程、導座標ws、spring相關context、web、test、junit 準備實體類,封裝資料 準備介面、實現類 重點注意:web.xml:Spring核心監聽、appcationContext.xml配置路徑、CXFServlet 第二步:釋出服務 在appcationContext.xml配置釋出服務的資訊 網路訪問路徑:address 服務介面及實現類 第三步:呼叫服務(給別人呼叫) 瀏覽器可以呼叫 自己寫java程式作為客戶端可以呼叫 http://localhost:埠/專案名/CXFServlet訪問路徑/userService123?wsdl
3.rs獨立釋出
第一步:準備服務 建jar工程,匯入座標rs、jetty、slf4j-log4j12 準備實體類,封裝資料,需要在實體類上加上註解: @XmlRootElement(name = "xxx") 作用:@XmlRootElement指把哪些實體類轉成json或者xml格式 如果某個實體類不加@XmlRootElement,會報:Document is Empty 準備介面、實現類 第二步:釋出服務 訪問路徑:http://localhost:埠 jaxrsServerFactoryBean.create(); 第三步:呼叫服務(給別人呼叫)
4.Restful 介紹
Restful是一種程式設計風格,同樣的資源路徑,加上不同的註解之後,可以做不同的操作。
注意:它是一種設計風格,不是標準。
1.請求方式的註解
@POST請求方式訪問 儲存操作(增,英文:Create)
@DELETE請求方式訪問 刪除操作(刪,英文:Delete)
@PUT請求方式訪問 修改操作(改,英文:Update)
@GET請求方式訪問 查詢操作(查,英文:Retrieve)
2.訪問資源路徑的註解:@Path("/aaa")
如果訪問aaa中的bbb方法 釋出的服務地址+/aaa/bbb
3.請求引數和返回值的註解:@Produces生成(方法返回值)@Consumes消費(方法引數)
@Consumes({"application/xml","application/json"}) 傳參
與WebClient的type方法對應,表示傳入的複雜引數的解析型別,
@Produces({"application/xml","application/json"}) 返回
與WebClient的accept方法對應,表示呼叫方法完後的返回給網路的資料解析型別
@PathParam 簡單引數,表示路徑引數,常用於傳單個簡單引數的使用
eg: http://localhost:8080/userService/user/1 @Path("/user/{id2}")與@PathParam("id2")對應
@QueryParam 簡單引數,表示路徑引數,常用於傳幾個簡單引數的使用
eg: http://localhost:8080/userService/user?id3=1 引數名id3與@QueryParam("id3")對應
注:@Consumes與@PathParam和@QueryParam的區別:
@PathParam和@QueryParam處理簡單引數型別,如String、Integer等
主要是8種原始型別+8中包裝型別+String
@Consumes處理自定義物件型別
一般簡單引數用@PathParam和@QueryParam,如果引數較多,課封裝成物件,用@Consumes
線上解析地址:http://tool.oschina.net/codeformat/json
5.JAX-RS整合Spring開發
1、準備服務
1)建立maven的war工程,匯入座標rs、json轉換、Spring相關
2)web.xml配置Spring核心監聽及applicationContext.xml路徑、配置核心CXFServlet
<!-- spring配置檔案位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- spring核心監聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 解決控制檯webservice Encoding:ISO-8859-1 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- cxf servlet配置 -->
<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
3)匯入實體類(封裝資料、傳輸資料)、服務介面及實現類
4)applicationContext.xml上配置jaxrs:server、address、服務介面的實現類
**applicationContext.xml路徑、配置核心CXFServlet如下:**
<jaxrs:server id="xx" address="/路徑地址" >
<jaxrs:serviceBeans>
<bean class="介面實現類" />
...
</jaxrs:serviceBeans>
<!--這是內建攔截器,直接放這用 -->
<jaxrs:inInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
</jaxrs:inInterceptors>
<jaxrs:outInterceptors>
<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
</jaxrs:outInterceptors>
</jaxrs:server>
2、釋出服務
啟動工程即釋出服務
訪問路徑:
伺服器根目錄地址+web.xml配置+applicationContext.xml 的address配置 +類@Path+方法@Path,檢視當前訪問路徑是否都書寫正確,且web.xml中,路徑一般為為:/xx/*,目的是在mapping中不讓其對映所有<servlet-mapping>。
比如: http://localhost:9996/cxf_rs_spring/services/myService11111/userService/user
localhost:9996/cxf_rs_spring對應伺服器根目錄地址
services與web.xml對應
myService11111與applicationContext.xml的address對應
userService與服務介面的@Path對應
user與方法上@Path對應
3、呼叫服務(給別人呼叫)
1)瀏覽器呼叫
2)WebClient呼叫
注意使用時路徑問題,很容易錯!!!