您的位置:首页 > 其它

JAX-RS 2.0 中 REST 的四种服务类型

2015-01-24 01:25 543 查看
最近在学习 jersey 框架。他是 目前比较流行的 基于 JAX-RS 2.0 规范实现的 RESTful 框架。

我是跟着 《Java RESTful Web Service 实战》 一书 在学习。书中有些知识点,不太常用,但是比较重要,特写下次笔记已备忘。

概要

如下图:

情况一:当不存在 Application 子类,也不存在 Servlet 子类时

情况二:当不存在 Application 子类,但是存在 Servlet 子类时

情况三:当存在 Application 子类,而且 Application 子类被 ApplicationPath 注解所修饰。

情况四:当存在 Application 子类,但是没有被ApplicationPath 注解所修饰。



此图来自于《Java RESTful Web Service 实战》

描述

情况一

以下xml代码是 servlet 容器的
web.xml
中的 去除 的子元素。

当不存在 Application 子类,也不存在 Servlet 子类时,规范中定义,在这种情况下,为REST服务动态生成一个名为
javax.ws.rs.core.Application
的 Servlet 实例,并自动探测匹配资源。与此同时,需要根据Servlet的不同版本,在
web.xml
定义REST请求处理的Servlet为这个动态生成的Servlet.

xml
<!-- Servlet 3.x 中的配置 -->
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

xml
<!-- Servlet 2.x 中的配置 -->
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.example</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

通过 Servlet2.x 中 web.xml 的配置项,可以看出,jersey-container-servlet-core 不具备自动扫描资源类的功能。

其中
org.glassfish.jersey.servlet.ServletContainer
是 jersey 中
Servlet的基类
,它继承于
HttpServlet


情况二

当不存在 Application 子类,但是存在 Servlet 子类时。

java
// Servlet3.x 中 一个 Servlet 定义
@WebServlet(
initParam = @WenInitParam(name = "jersey.config.server.provider.packages", value="com.example"),
urlPatterns="/webapi/*",
loadOnStratup = 1
)
public class AirServlet extends ServletContainer {

}

以上是 基于 Servlet3.x 的 REST 服务。在 Servlet3.x 的场景下,可以省略
web.xml
文件。但是 Servlet 项目中如果没有
web.xml
的话,在使用 maven 发布war 的时候会报错,所以需要设置
maven-war-plugins


xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>


情况三:

当存在 Application 子类,而且 Application 子类被ApplicationPath注解所修饰。

java
@ApplicationPath("/webapi/*")
public class AirApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(BookResource.class);
return classes;
}
}

也可以使用,packages 方法 会扫描所有的资源类。

java
@ApplicationPath("/webapi/*")
public class AirResourceConfig extends ResourceConfig {
public AirResourceConfig() {
packages("com.example");
}
}

情况四:

当存在 Application 子类,但是没有被 ApplicationPath 注解所修饰

我们需要先 定义一个 Application 子类,已完成 Servlet 的配置。

java
public class AirApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
final Set<Class<?>> classes = new HashSet<Class<?>>();
classes.add(BookResource.class);
return classes;
}
}

xml
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.example.AirApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

以上配置,可以生效与 Servlet2.x 版本中。我们可以 利用 Servlet3.x 的特性来简化这些设置。

xml
<servlet>
<servlet-name>com.example.AirApplication</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>com.example.AirApplication</servlet-name>
<url-pattern>/webapi/*</url-pattern>
</servlet-mapping>

以上就是 JAR-RS 规范中定义的四种 REST 服务的方式。

以上文字片段以及图片,部分来自于 《Java RESTful Web Service 实战》一书。如有版权侵犯,请联系邮箱[ychangsheng@gmail.com]。本人及时修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: