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類似。