用 Java 技术创建 RESTful Web 服务(5)配置
 
- UID
- 1066743
|

用 Java 技术创建 RESTful Web 服务(5)配置
配置至此,我们探讨了 JAX-RS 资源类和一些提供程序类(MessageBodyReaders 和 MessageBodyWriters)。那么,该如何在 JAX-RS 运行时内配置这些类呢?这可以通过扩展 javax.ws.rs.core.Application 类实现。此类提供了一组类或一组单例(singleton)对象实例,在一个 JAX-RS 应用程序内包括所有的 根级别的资源和提供程序(由 @Provider 注释的类)。若为这个示例联系信息应用程序扩展这个 Application 类,它应该类似于清单 13。
清单 13. ContactInfoApplication1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| package com.ibm.jaxrs.sample.organization;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class ContactInfoApplicaiton extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSetSet<Class<?>>();
classes.add(ContactsResource.class);
classes.add(ContactInfoWriter.class);
classes.add(ContactInfoReader.class);
}
public SetSet<Object<?>> getSingletons() {
// nothing to do, no singletons
}
}
|
getClasses 方法为 JAX-RS 运行时提供了一组可用于元数据的类。请注意,getSingletons 方法什么都不返回。通常而言,将 JAX-RS 提供程序视为单例是没有问题的,但将一个 JAX-RS 资源视为单例则要格外谨慎。常被 JAX-RS 资源类使用的基于注释的注入可能在一个单例实例的情况内并不受支持。因此,除非仔细计划,否则应该避免使用 JAX-RS 资源的单例实例。
假设,您正在一个 servlet 容器内部署一个 JAX-RS 应用程序,有两种方法可以向 JAX-RS 运行时注册您的 javax.ws.rs.core.Application 子类。这是由 WAR 文件的 web.xml 处理的,如下所示。
清单 14. 不能感知 JAX-RS 的 servlet 容器1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <web-app id="WebApp_ID" version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>ContactInfoServlet</servlet-name>
<servlet-class>com.sample.RESTSystemServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>
com.ibm.jaxrs.sample.organization.ContactInfoApplication
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ContactInfoServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
|
在一个被认为是不能感知 JAX-RS 的 servlet 容器内,应该作为 servlet 定义内的 init-param 提供 Application 子类名。init-param 的名字必须是 javax.ws.rs.Application。servlet 类则很可能是 JAX-RS 运行时系统 servlet。您可以列出每个可能的 URL 模式,或者使用 /* 通配符注册,如下所示。
清单 15. 能感知 JAX-RS 的 servlet 容器1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <web-app id="WebApp_ID" version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>ContactInfoServlet</servlet-name>
<servlet-class>
com.ibm.jaxrs.sample.organization.ContactInfoApplication
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ContactInfoServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
|
在一个被认为是能感知 JAX-RS 的 servlet 容器内,必须作为 servlet 定义内的 servlet 类元素的值提供 Application 子类名。您仍然可以选择是列出每个可能的 URL 模式还是使用 /* 通配符注册。 |
|
|
|
|
|