在Spring MVC REST應用程序中自動生成WADL

上一次我們學習了WADL的基礎知識 。 語言本身并沒有那么有趣,只寫了一篇有關它的文章,但是本文的標題揭示了為什么我們需要這些知識。

JSR 311的許多實現:JAX-RS:RESTful Web服務的Java API提供了開箱即用的運行時WADL生成: Apache CXF , Jersey和Restlet 。 RESTeasy還在等待。 基本上,這些框架檢查帶有JSR-311批注的Java代碼,并在某些URL下生成WADL文檔。 不幸的是,Spring MVC不僅不實現JSR-311標準(請參閱: Spring MVC是否支持JSR 311注釋? ),而且即使它非常適合于我們,也不會為我們生成WADL(請參閱: SPR-8705 )。公開REST服務。

由于種種原因,我開始使用Spring MVC開發服務器端REST服務,過了一會兒(比如說,后來的第三方資源),我開始迷路了。 我確實需要一種對所有可用資源和操作進行分類和記錄的方法。 WADL似乎是一個不錯的選擇。

幸運的是,Spring框架已開放擴展,如果您愿意在一段時間內瀏覽代碼,可以輕松地基于現有基礎結構添加新功能。 為了生成WADL,我需要一個應用程序處理的URI列表,實現的HTTP方法以及(理想情況下)哪種Java方法處理每個方法。 為@Controller,@RequestMapping,@PathVariable等掃描- -顯然Spring啟動捆扎MVC 的DispatcherServlet在做這項工作已經某處這樣看來聰明重用這些信息而不是再次執行任務。

猜猜看,看起來我們需要的所有信息都保存在一個奇怪的RequestMappingHandlerMapping類中。 這是一個調試器屏幕截圖,僅用于概述如何提供豐富的信息:

但是它變得更好:RequestMappingHandlerMapping實際上是一個Spring Bean,您可以輕松地注入和使用它:

@Controller
class WadlController @Autowired()(mapping: RequestMappingHandlerMapping) {@RequestMapping(method = Array(GET))@ResponseBody def generate(request: HttpServletRequest) = new WadlApplication()}

沒錯,我們將使用另一個Spring MVC控制器來生成WADL文檔。 上一次我們設法生成表示WADL文檔的JAXB類(畢竟WADL是一個XML文件),因此通過返回空的WadlApplication實例,我們實際上返回的是空的但有效的WADL:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02"/>

我不會解釋實現的細節(提供完整的源代碼 ,包括示例應用程序)。 基本上,這是將Spring模型重寫為WADL類的問題。 如果您有興趣,請查看WadlGenerator.scala,它是解決方案和測試用例的中心點。 這是其中之一:

test("should add parameter info for template parameter in URL") {given("")val mapping = Map(mappingInfo("/books", GET) -> handlerMethod("listBooks"),mappingInfo("/books/{bookId}", GET) -> handlerMethod("readBook"))when("")val wadl = generate(mapping)then("")assertXMLEqual(wadlHeader + """<resource path="books"><method name="GET"><doc title="com.blogspot.nurkiewicz.springwadl.TestController.listBooks"/></method><resource path="{bookId}"><param name="bookId" required="true" /><method name="GET"><doc title="com.blogspot.nurkiewicz.springwadl.TestController.readBook"/></method></resource></resource>""" + wadlFooter, wadl)
}

不幸的是,我懶得不能正確地給定名稱/何時/然后命名。 但是測試應該可讀性強。

我要提及的唯一技術難題是將Spring基礎結構提供的平面URI模式轉換為分層的WADL對象(基本上是樹)。 這是此問題的簡化版本:具有URI模式的列表,如下所示:

/books
/books/{bookId}
/books/{bookId}/reviews
/books/best-sellers
/readers
/readers/{readerId}
/readers/{readerId}/account/new-password
/readers/active
/readers/passive

生成以下樹數據結構:

當然,數據結構就像持有標簽和Node子列表的Node對象一樣簡單。 并不是那么有挑戰性,但是可能是一個有趣的CodeKata 。

那么,這個WADL有什么意義呢? XML是否真的更具可讀性,并有助于管理大量REST應用程序? 如果沒有對WADL的 soapUI強大的支持,我什至不會打擾它。 為我推送的示例應用程序生成的WADL也可以輕松導入到soapUI:

值得一提的兩個功能。 首先,soapUI顯示一棵 REST資源 (與導入WSDL時的平面操作列表相反)。 每個HTTP方法旁邊都有一個相應的Java方法(可以禁用此方法)來處理它,以進行故障排除和調試。 其次,我們可以選擇任何HTTP方法/資源并調用它。 基于WADL的描述,soapUI將創建一個用戶友好的向導,可以在其中輸入參數。 默認值將自動填充。 完成后,應用程序將生成帶有正確URL和內容的HTTP請求,并在到達時顯示響應。 真的很有幫助!

順便說一句,您是否注意到max和page查詢參數? 我們的小型圖書館使用反射來查找@RequestParam批注,例如以下控制器:

@Controller
@RequestMapping(value = Array("/book/{bookId}/review"))
class ReviewController @Autowired()(reviewService: ReviewService) {@RequestMapping(method = Array(GET))@ResponseBody def listReviews(@RequestParam(value = "page", required = false, defaultValue = "1") page: Int,@RequestParam(value = "max", required = false, defaultValue = "20") max: Int) =new ResultPage(reviewService.listReviews(new PageRequest(page - 1, max)))//...}

將被翻譯成與WADL兼容的描述:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<application xmlns="http://wadl.dev.java.net/2009/02"><doc title="Spring MVC REST appllication"/><resources base="http://localhost:8080/api"><resource path="book"><!-- --><resource path="{bookId}"><param required="true" style="template" name="bookId"/><!-- --><resource path="review"><method name="GET"><doc title="com.blogspot.nurkiewicz.web.ReviewController.listReviews"/><request><param required="false" default="1" style="query" name="page"/><param required="false" default="20" style="query" name="max"/></request></resource></resource></resource></resource
</application>

希望您對我編寫的這個小型圖書館感到開心。 隨時將其包含在您的項目中,不要猶豫,報告錯誤。 GitHub上提供了Apache許可下的完整源代碼: https : //github.com/nurkiewicz/spring-rest-wadl。

參考: JCG合作伙伴 在Spring MVC REST應用程序中自動生成WADL ? Java和社區博客中的Tomasz Nurkiewicz。


翻譯自: https://www.javacodegeeks.com/2012/02/automatically-generating-wadl-in-spring.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373803.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JSP靜態導入與動態導入

JSP靜態導入&#xff08;JSP指令標記include&#xff09; JSP頁面第一次被請求時&#xff0c;會被JSP引擎轉譯成Servlet的Java文件&#xff0c;然后再被編譯成字節碼文件執行。JSP指令標記為JSP頁面轉譯提供整個頁面的相關信息。 include指令用于在JSP頁面靜態插入一個文件&…

關于DJANGO和JAVASCRIPT的時間

最近&#xff0c;實際一些簡單統計時&#xff0c;要到庫里去檢索數據出來用HIGHCHARTS畫圖&#xff0c; 作一個簡單的回照。。 DJANGO用TEMPLATEVIEW來作。專業&#xff0c;正規&#xff1a;&#xff09; class SAView(TemplateView):template_name version/sa_site.htmlpagin…

git里面的文件怎么刪不掉_.git目錄刪不掉

這樣的情況并非是第一次遇到了&#xff0c;以前總是會覺得這樣的問題只是電腦的錯亂&#xff0c;重啟一下電腦就好了&#xff0c;但是并非每次都需要重啟電腦的&#xff0c;其實簡單的設置一下&#xff0c;這個問題就可以解決了。對了&#xff0c;咱們還是說說這到底是個什么問…

集成框架比較– Spring集成,Mule ESB或Apache Camel

公司之間的數據交換增加了很多。 必須集成的應用程序數量也增加了。 這些接口使用不同的技術&#xff0c;協議和數據格式。 但是&#xff0c;這些應用程序的集成應以標準化的方式建模&#xff0c;有效實現并由自動測試支持 。 JVM環境中提供了三個可滿足這些要求的集成框架&…

Vue.js組件學習

組件可以擴展HTML元素&#xff0c;封裝可重用的HTML代碼&#xff0c;我們可以將組件看作自定義的HTML元素。組件系統提供了一種抽象&#xff0c;讓我們可以使用獨立可復用的小組件來構建大型應用。 一個簡單組件例子(全局注冊&#xff09; <!DOCTYPE html> <html>&…

Winform MD5

1&#xff1a;MD5 http://www.cmd5.com/ 字節數組----字符串 //將字節數組中每個元素按照指定的編碼格式解析成字符串//直接將數組ToString()//將字節數組中的每個元素ToString() //ToString("Params") ToString("x") //可以將十進制字符串轉換為16進制字符…

HTML元素顯示與隱藏

在WEB開發中&#xff0c;前臺HTML中經常需要控制元素的隱藏與顯示&#xff0c;我們最為最常見是二級導航欄&#xff08;通過鼠標的移動來觸發onmouseover&#xff0c;onmouseout事件來實現二級菜單的顯示與隱藏&#xff09;二級菜單的顯示與隱藏。 然而控制元素的影響與顯示有…

書評:JavaFX 2.0:示例介紹

盡管Oracle在JavaOne 2010和JavaOne 2011上對JavaFX的更改使我從懷疑論者轉變為對JavaFX的信奉者 &#xff0c;但是JavaFX愿景的轉變并非沒有缺點 。 特別是&#xff0c;JavaFX圖書市場一直很棘手&#xff0c;因為幾乎所有可用的JavaFX圖書都與1.x版本有關。 在這篇文章中&…

腦子越來越不好使,文字越來越像馱shi

沒辦法&#xff0c;還是記下來。。。轉載于:https://www.cnblogs.com/thorlet/p/5926595.html

python機制_python異常機制個人理解(參考網上資料)

當你的程序中出現異常情況時就需要異常處理。比如當你打開一個不存在的文件時。當你的程序中有一些無效的語句時&#xff0c;Python會提示你有錯誤存在。下面是一個拼寫錯誤的例子&#xff0c;print寫成了Print。Python是大小寫敏感的&#xff0c;因此Python將引發一個錯誤&…

NYOJ 24 素數距離問題

素數距離問題 時間限制&#xff1a;3000 ms | 內存限制&#xff1a;65535 KB難度&#xff1a;2描述 現在給出你一些數&#xff0c;要求你寫出一個程序&#xff0c;輸出這些整數相鄰最近的素數&#xff0c;并輸出其相距長度。如果左右有等距離長度素數&#xff0c;則輸出左側的…

C#控件大小隨窗體大小等比例變化

相信很多博友在開發初次接觸學習C# winForm時&#xff0c;當窗體大小變化時&#xff0c;窗體內的控件并沒有隨著窗體的變化而變化&#xff0c;最近因為一個項目工程的原因&#xff0c;也需要解決這個問題。通過查閱和學習&#xff0c;這個問題得到了解決&#xff0c;或許不是很…

Google Appengine登臺服務器操作方法

Google的App Engine開箱即用&#xff0c;支持版本化部署。 您可以非常輕松地在各修訂版之間來回切換&#xff0c;這是在上線之前正確測試應用程序的一項很棒的功能。 有一個主要問題&#xff1a;應用程序的所有版本共享同一數據存儲。 因此&#xff0c;如果要遷移數據&#xff…

下 面 這 條 語 句 一 共 創 建 了 多 少 個 對 象 : String s=a+b+c+d;

javac 編譯可以對字符串常量直接相加的表達式進行優化&#xff0c; 不必要等到運行期去進行加法運算處理&#xff0c; 而是在編譯時去掉其中的加號&#xff0c; 直接將其編譯成一個這些常量相連的結果。題目中的第一行代碼被編譯器在編譯時優化后&#xff0c; 相當于直接定義了…

公共樣式_設計干貨 | 園路鋪裝的100種樣式,保存收好

Part 1園路的形式主干道&#xff1a;聯系全園&#xff0c;必須考慮通行、生產、救護、消防、游覽的需要。次干道&#xff1a;溝通各景點、建筑&#xff0c;通輕型車輛。休閑小徑、健康步道&#xff1a;健康步道是近年來最為流行的足底按摩健身方式。通過行走卵石路上按摩足底穴…

22個所見即所得在線 Web 編輯器

新聞來源:sixrevisions.com我們曾介紹過 10 個基于 JavaScript 的 WYSIWYG&#xff08;所見即所得&#xff09; 編輯器&#xff0c;這些 Web 編輯器可以在線編輯和處理富 Web 內容&#xff0c;包括格式文本&#xff0c;表格&#xff0c;圖片&#xff0c;媒體&#xff0c;鏈接等…

配置阿里云作為yum 源

第一步&#xff1a;下載aliyum 的yum源配置文件。 http://mirrors.aliyun.com/repo/ 第二步&#xff1a;把下載到的repo文件復制到/etc/yum.repo.d/目錄下。 ----------------------------------------------------下面是本地yum源的一個例子 [base_extra]namebase & extra…

Spring 3,Spring Web Services 2和LDAP安全

今年的開局很好&#xff0c;其中另一個“截止日期不會改變” /“跳過所有繁文tape節” / “狂野西部”類型的項目中&#xff0c;我必須弄清楚并使用相對而言實現一些功能。新的庫和技術需要進行更改&#xff0c;Spring 3并不是新增功能&#xff0c;但是在Java 5&#xff0c;web…

vue 日期選擇器默認時間_vue-datepicker

vue-datepicker基于 Vue 的日期/時間選擇組件。安裝NodeJS 環境 (commonjs)npm i hyjiacan/vue-datepicker或者yarn add hyjiacan/vue-datepicker可以通過以下方式獲取最新的代碼git clone https://github.com/hyjiacan/vue-datepicker.git源碼倉庫瀏覽器環境 (umd)Since 2.4.0…

easyUI validate函數【總結篇-部分轉】

以下是自己總結和修改別人的帖子和資源整理出來的一些常用驗證函數&#xff0c;備用&#xff0c;交流。 <body>郵箱驗證&#xff1a;<input type"text" validtype"email" required"true" missingMessage"不能為空" invalidMe…