JAX-RS(JSR-311)是在Java EE环境中提供RESTful服务功能的规范。 它有望为您提供传统的基于SOAP的Web服务的可行替代方案。
在本文中,了解JAX-RS的主要组件。 一个示例说明了企业如何使用JAX-RS中的功能以RESTful方式公开员工联系信息。
背景
多年来,开发人员已经使用各种工具在其Java应用程序中创建RESTful服务。 凭借REST体系结构的简单性,可以通过一个简单的Java Web容器满足主要要求(能够接收HTTP消息和标头)。
Java servlet通常用于开发RESTful应用程序。 没有使用servlet的说明性模式。 通常,Servlet将接受请求并解析HTTP请求URI本身,以将请求与已知资源进行匹配。 对于REST服务开发,简单的servlet模型在更加形式化的API中进行了扩展。 但是,由于API是在servlet模型的顶部开发的,所以没有一个是作为正式标准开发的。
随着REST被越来越多地用作体系结构,Java Community Process(JCP)试图在即将发布的Java Enterprise Edition 6版本中包括对REST的正式支持。 创建JSR-311并产生了JAX-RS 1.0规范,它提供了一种新的基于注释的方法来开发RESTful服务。 与Servlet模型相反,JAX-RS批注使您可以专注于资源和数据对象。 并且,您不再需要开发通信层(通过servlet)。
Java资源
JAX-RS建立了一个本地语言来描述其编程模型所代表的资源。 有五个主要项目:根资源,子资源,资源方法,子资源方法和子资源定位符。
根资源
根资源是带有@Path
注释的Java类。 @Path
批注提供了一个value
属性,该属性指示资源可用的路径。 value
属性可以是文字字符,变量或变量加上自定义的正则表达式。 清单1显示了一个示例。
清单1. JAX-RS根资源
package com.ibm.jaxrs.sample.organization;
import javax.ws.rs.Path;
@Path(value="/contacts")
public class ContactsResource {
...
}
子资源
子资源是由于子资源定位器调用而返回的Java类。 它们与根资源相似,不同之处在于它们不使用@Path
注释,因为它们的路径在子资源定位器上描述。 子资源通常包含使用HTTP请求方法指定符注释的方法来处理请求。 如果它们不包含此类带注释的方法,则它们将通过委派给适当的子资源定位器来进一步解决处理请求的资源。
清单2. JAX-RS子资源
package com.ibm.jaxrs.sample.organization;
import javax.ws.rs.GET;
public class Department {
@GET
public String getDepartmentName() {
...
}
}
上面的清单2显示了ContactsResource.getContactDepartment
方法返回的子资源。 在这个例子中,如果一个HTTP GET请求被发送到/contact/{contactName}/department
道路, getDepartmentName
在资源法Department
子资源将处理该请求。
资源方法
资源方法是根资源或子资源中绑定到HTTP方法的Java方法。 绑定是通过@GET
注释之类的注释完成的。
清单3. JAX-RS资源方法
package com.ibm.jaxrs.sample.organization;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path(value="/contacts")
public class ContactsResource {
@GET
public List<ContactInfo> getContacts() {
...
}
}
在清单3的示例中,发送到/contacts
路径的HTTP GET请求将由getContacts()
资源方法处理。
子资源方法
子资源方法与资源方法非常相似。 唯一的区别是子资源方法还带有@Path
注释,从而进一步限定了方法的选择。
清单4. JAX-RS子资源方法
package com.ibm.jaxrs.sample.organization;
import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path(value="/contacts")
public class ContactsResource {
@GET
public List<ContactInfo> getContacts() {
...
}
@GET
@Path(value="/ids")
public List<String> getContactIds() {
...
}
}
在清单4中,发送到/contacts/ids