当JAX-RS 1.0在2008年第一次由JSR-311——特别是其领导者Marc Hadley和Paul Sandoz——公之于众的时候,它就成为了第一个基于POJO/Annotation的、用于创建健壮的Web应用的框架。
现在五年过去了,Java EE 7已经发布并且它包含了最新的JAX-RS 2.0版本,JSR-339的实现由Marek Potociar和Santiago Pericas-Geertsen发起。我们将拭目以待一些新特性,它们将使得升级到JAX-RS 2.0变得有意义,但是首先,我们先来快速的回顾一下JAX-RS 1.0。
@Path(portfolios) public class PortfolioResource { @GET public Collection<Portfolio> allPortfolios() { . . . } @GET public Portfolio getPortfolio( @PathParam("portfolioId") String id) { . . . } }
在上面的列表中,第一行表示把这个资源映射到相关的路径/文件夹。第四行表示一个GET请求应该返回所有的文件夹。第九行和第十行表明一个GET请求,例如带有URI/文件夹/123的请求,应该提起出紧跟在资源URI(例如:文件夹)之后的参数(例如:123),并且把它声明为变量“id”,之后返回重组的文件夹。
这个语法在JAX-RS 2.0中任然保留。
与Java EE 7的核心主题相一致,JAX-RS 2.0添加了一些期待已久的特性,这些特性主要围绕Oracle所称的“简化API”。
这些特性可以这样分类:
我们将快速的看一下每个分类:
客户端API
JAX-RS 1.0是一个严格的客户端API,一些实现对客户端提供了各种等级的支持,但是通常开发人员会安装像Apache软件基Jakarte公共组件中的HttpClient 或 WizTools的 REST Client。
JAX-RS 2.0 为客户端调用Web服务添加了一个"构建" 工具:
Client client=ClientFactory.newClient(); String shares=client.target("http://.../portfolio/123") .pathParam("identifier", "IBM") .queryParameter("identifierType", "ticker") .request("text/plain).get(String.class");
我们看,这个方法首先包含了一个客户端(client),然后使用了构建模式来构造URL的所有参数,同时,允许开发人员不需要使用各种各样的URL构造器来规划URL。
这个方法对于一个带有HTTP正文的请求来讲尤其有效,例如HTTP POST和HTTP PUT。下面的例子让应用能够出售100股的IBM:
Stock stock=client.target("http://.../portfolio/123/sell") .pathParam("identifier", "IBM") .queryParameter("identifier", "ticker") .request("application/json") .post(text("100", Shares.class));
异步
在JAX-RS 1.0中,一个要调用的客户端需要等待服务器传回的响应。2.0嵌入了异步支持。这让一个客户端能够发起一个REST的调用,并且在响应完成的时候得到一个Future或者一个InvocationCallback作为通知。
HATEOAS(超媒体)
根据严格的RESTafarian规范,如果你没有使用HATEOAS,你就不是在做REST!HATEOAS(作为应用状态引擎的超媒体)要求REST的生产者和客户在“每个调用返回一组链接”上达成共识,以便进行下一步。如果你认为REST是一个应用版本的Web页,那么HATEOAS就可以认为是包含一组Web页面的链接。
JAX-RS 2.0提供了Link和Target类,来把超链接嵌入到一个服务器端的响应当中,并把它们响应到客户端去。
注释
新的注释已经嵌入,例如支持新的注入。
Bean验证
一个基于注释的机制来识别参数的meta-data。例如“@NotNull shares”代表“shares”参数不允许为null。你同样可以提供传统的注释,比如保证特定的数据格式,例如邮编或者电话号码。
过滤器与处理程序
过滤器API提供了在一个响应模式链中链入servlet过滤器的能力。这对于嵌入正统的概念来过很有用,比如登入。任意过滤器都能够通过调用FilterAction.NEXT或者FIlterAction.STOP来各自决定是继续还是终止链。
处理程序与过滤器很相似,只不过他们在特定的扩展点中包含了一个方法调用。这对于扩展点的获取调用来讲很有用,例如调整或者丰富负载数据。
内容协商
@Accepts和@Produces参数更丰富的注释,让你可以优先处理请求/响应格式。
JAX-RS仍旧缺失一个好的安全模型,这使得使用外部的企业应用有些困难。我们希望下一个发布版本将会提供对于点对点认证的支持。
距离JEE容器提供JAX-RS 2.0的支持可能还有一段时间。然而你可以通过在你的应用中部署最新版本的Jersey来立即获益。Oracle已经发布了在WebLogic 12c中实施的步骤。
更多的信息,请看OTN的文章Java EE 7与JAX-RS 2.0,它由JSR 339专家团队成员Adam Bien所作。
评论删除后,数据将无法恢复
评论(1)