wadl 生成java_在Spring MVC REST应用程序中自动生成WADL

wadl 生成java

上一次我们学习了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

wadl 生成java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓应用和ios应用下载地址生成一个统一二维码

前言&#xff1a;这个需要自己的应用已经上线到腾讯应用宝、APPStore.终极解决办法腾讯应用宝「微下载 」&#xff0c;是目前生成二合一APP推广二维码的最佳方式。原因如下1. 微信仅支持应用宝「微下载」&#xff0c;才能直接下载APP● 微信拥有11亿用户量&#xff0c;“扫一扫…

程序员应该如何才能买房?

前段时间对象问我应该在哪买房&#xff0c;我的意见是现在一个小的城市搞个刚需房&#xff0c;后面可以再换个一线的大房子&#xff0c;后来她的建议是在工作附近搞一套&#xff0c;这样不用一边工作一边还房贷。无奈只能咨询各位大咖。看完这个大佬的经历&#xff0c;发现好多…

小程序开发从0到1

公司最近也想做小程序&#xff0c;简单梳理了一下&#xff0c;希望能给新人带来一点启发。 话不多说&#xff0c;直接上干货。 不是码农也想开发的直接采用混合式开发的方案&#xff0c;查漏补缺&#xff0c;用模板肯定会有点生硬&#xff0c;想走的更远建议还是采用原生开发的…

javaScript入门基础说明

JavaScript 教程 JavaScript 是 Web 的编程语言。 所有现代的 HTML 页面都使用 JavaScript。 JavaScript 非常容易学&#xff0c;本教程将教你打开 JavaScript 的大门 浏览器中的 JavaScript 能做什么&#xff1f; 现代的 JavaScript 是一种“安全”语言。 它不提供对内存…

ActiveMQ作为Logstash的消息代理

扩展Logstash时&#xff0c;通常会添加一个消息代理&#xff0c;该消息代理用于在一个或多个Logstash节点处理传入消息之前临时缓冲传入的消息。 数据通过像Beaver这样的发运人推送到代理&#xff0c; Beaver读取日志文件并将每个事件发送到代理。 或者&#xff0c;应用程序可以…

在编译器中鼠标光标变成下横线的解决办法

适用于各种智能编译器&#xff0c;HB-X,VSCode,ST3,IDEA等。 问题&#xff1a; 按一下键盘上的&#xff0c;insert 键。

java自定义序列化_Java中的自定义国际化(i18n)

java自定义序列化国际化&#xff08;i18n&#xff09;在我们的软件项目中非常重要。 它主要带来以下好处&#xff1a; 将UI字符串外部化为代码文件以外的外部文件&#xff0c;以及易于管理的UI内容。 支持多种语言。 在这篇文章中&#xff0c;将为Eclipse和Java项目提供一个i…

让一个文字在背景图片水平居中的方法

最近工作中在做那个可视化大屏&#xff0c;图中用到了大量的装饰图片&#xff0c;下面看一下文字怎么在图片中水平居中。 这个方法比较好用&#xff0c;其他的方法嵌入太多可能不是特别好使&#xff0c;尤其嵌入到多个框架中。 html <!DOCTYPE html> <html><h…

Objective-C中,ARC下的 strong和weak指针原理解释

Objective-C中&#xff0c;ARC下的 strong和weak指针原理解释 提示&#xff1a;本文中所说的"实例变量"即是"成员变量"&#xff0c;"局部变量"即是"本地变量" 一、简介 ARC是自iOS 5之后增加的新特性&#xff0c;完全消除了手动管理内…

elementui去掉表格所有边框

/deep/.el-table {border: 0;th,tr,td{border: 0;background-color: #fff;}&::before {height: 0px;}&::after {width: 0;}.el-table__fixed:before {height: 0;}}

前端-html、css

HTML一、html简介超级文本标记语言是标准通用标记语言下的一个应用&#xff0c;也是一种规范&#xff0c;一种标准&#xff0c;它通过标记符号来标记要显示的网页中的各个部分。网页文件本身是一种文本文件&#xff0c;通过在文本文件中添加标记符&#xff0c;可以告诉浏览器如…

在Java EE组件中使用骆驼路线

从现在开始我一直在与Camel合作&#xff0c;我真的很喜欢它的简单性。 在Java EE之上始终使用它一直是一个挑战&#xff0c;而我最近发表的有关如何做到这一点的演讲之一以及Java EE中引导Camel的不同方法实际上建议使用WildFly-Camel Subsystem 。 在正在进行的系列文章中&…

webpack入门

遇到问题首先到github项目的Issues中&#xff0c;检索一下相关问题&#xff0c;比在百度谷歌上直接搜索非官方解决方案好得多。 1、npm init 生成 package.json 2、npm i -D webpack 生成 # npm i -D 是 npm install --save-dev 的简写&#xff0c;是指安装模块并保存到 packa…

接口自动化 基于python+Testlink+Jenkins实现的接口自动化测试框架

基于pythonTestlinkJenkins实现的接口自动化测试框架 by:授客 QQ&#xff1a;1033553122 博客&#xff1a;http://blog.sina.com.cn/ishouke 欢迎加入软件性能测试交流QQ群&#xff1a;7156436 目录 1、 开发环境... 1 2、 主要功能逻辑介绍... 1 3、 框架…

this的指向

箭头函数&#xff1a;定义时所在的作用域&#xff08;tip:继承而来 函数作用域 &#xff09; 普通函数&#xff1a;指向调用它的对象 箭头函数体内的 this对象&#xff0c;就是定义时所在的对象&#xff0c;而不是使用时所在的对象 1、箭头函数没有自己的this&#xff0c;ar…

事关每个程序员的职业规划与履历

今天&#xff0c;甚至过去&#xff0c;大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程&#xff0c;还是已经奋斗多年&#xff0c;以下内容都会对您的职业生涯有所助益。 目录 几条重要的职业规划提示。 1. 学习的步伐不停止 2. 学会问、学会听&#xff0c;学会学习…

程序员应该如何规划自己的人生与书写履历?

今天,甚至过去,大多数人都是由自己来设计他们的职业生涯的。 无论你正要启程,还是已经奋斗多年,以下内容都会对您的职业生涯有所助益。几条重要的职业规划提示。1. 学习的步伐不停止 古人说,活到老,学到老。终身学习应该是您的座右铭。 世界在不断变化,每个人都在寻找各…

浅谈多线程——NSThread

上一篇文章中我们大致了解了GCD的模式和方法&#xff0c;在iOS开发中除了GCD之外&#xff0c;还有NSThread和NSOperation两种多线程方式。 1.NSThread - a - 使用NSThread开辟多线程进行子任务处理&#xff1a;类方法和初始化方法 使用类方法不需要创建对象就可以直接开辟多线程…

2021年程序员可以做哪些副业?

哈喽&#xff0c;大家好&#xff0c;我是孙叫兽&#xff0c;本期内容给大家分享程序员搞副业的一期节目&#xff0c;欢迎大家一起学习。 1.程序员为什么要做副业&#xff1f; 副业意味着自由 时至今日&#xff0c;仍然有一大群程序员还天真地认为从事副业是一种压迫。但事实是&…

学习Apache Camel –实时索引推文

在大多数软件开发项目中&#xff0c;有一点需要使应用程序开始与其他应用程序或第三方组件通信。 无论是发送电子邮件通知&#xff0c;调用外部api&#xff0c;写入文件还是将数据从一个地方迁移到另一个地方&#xff0c;您都可以推出自己的解决方案或利用现有框架。 对于Jav…