天天看點

REST(四)RESTEasy實作REST

RESTEasy是JBoss的一個開源項目,提供各種架構幫助你建構RESTful Web Services和RESTful Java應用程式。它是JAX-RS規範的一個完整實作并通過JCP認證。作為一個JBOSS的項目,它當然能和JBOSS應用伺服器很好地內建在一起。但是,它也能在任何運作JDK5或以上版本的Servlet容器中運作。RESTEasy還提供一個RESTEasy JAX-RS用戶端調用架構。能夠很友善與EJB、Seam、Guice、Spring和Spring MVC內建使用。支援在用戶端與伺服器端自動實作GZIP解壓縮。

其他RESTEasy介紹見官網:[url]http://resteasy.jboss.org/[/url]。本節簡單介紹RESTEasy2+spring4的內建及用戶端通路。

[b]1.spring web基礎環境[/b]

見之前章節建立的web工程testRest。

[b]2.REST位址[/b]

與上一節類似,設計RESTEasy子產品/resteasy/*。

[b]3.RESTEasy庫[/b]

在項目pom.xml中加入RESTEasy依賴:

版本使用3.0.0.Final,因為更新的版本要求jdk1.8才能運作。

[b]4.Servlet[/b]

配置RESTEasy通路入口。

resteasy Servlet将攔截/resteasy/*下的所有通路。

RESTEasy與web、spring內建後,不需要再自己實作Application、Component等元件,也不需要配置檔案進行路徑配置,僅需要使用@Path注解。

[b]5.實作api[/b]

建立com.sunbin.test.resteasy包,新增TeachersResource類,以實作/teachers路徑的接口:

路徑注解@Path、傳回類型注解@Produces、通路方法@GET、參數讀取@FormParam,都和Jersey的JAX-RS相同。

重新部署項目後,通路[url]http://localhost:8080/testRest/resteasy/teachers[/url],發現報錯:

java.lang.NullPointerException

com.sunbin.test.resteasy.TeachersResource.get(TeachersResource.java:29)

檢查後發現是teacherService.list()語句中teacherService為null,@Autowired注解沒有生效。

嘗試使用xml配置方式實作teacherService注入,或使用jsr規範自有的@Inject、@Resource注解也不生效。

為什麼會這樣?分析是因為RESTEasy和spring的beanfactory之間依賴注入的問題。

RESTEasy官網手冊推薦以下兩種解決方法:

1.通過WebApplicationContextUtils工具類擷取ApplicationContext對象

2.自定義工具類

具體使用方法見我之前的文章:[url=http://sb33060418.iteye.com/blog/2372874]spring4學習(三)在非Spring類中擷取Bean[/url]

為了友善注入,這裡采用第二種方法:定義Context工具類SpringContextHolder并配置至spring。之後需要對Resource類進行改造:

在TeachersResource類的構造方法中手動通過SpringContextHolder擷取Bean,再指派給resource。

同樣的,新增TeacherResource類,以實作/teacher/{id}路徑的接口:

[b]6.js測試[/b]

使用上一節的測試頁面src\main\webapp\rest\index.jsp進行測試:

重新部署後,使用浏覽器通路[url]http://localhost:8080/testRest/rest[/url],測試内容和Restlet測試相同。

[b]7.RESTEasy Client測試[/b]

RESTEasy提供Client庫用于測試REST接口。

建立TestResteasy類,代碼如下:

測試結果與Restlet類似。