JAX-RS应用程序发布方式
作者:互联网
JAX-RS应用程序由一个或多个资源(Resource)和零个或多个提供程序(Provider)组成。 组成JAX-RS应用程序的资源和提供程序是通过应用程序提供的Application子类进行配置的。 一个JAX-RS的实现可以提供替代的机制来定位资源类和提供者(例如运行时类扫描),但是使用Application是唯一可移植的配置方式。
根据应用程序是在Java SE环境中运行还是在容器中运行,应用程序以不同的方式发布。这里讨论将JAX-RS打包成Java Web的形式进行部署。建议实现支持Servlet3框架可插入性机制,以实现容器之间的可移植性,并利用容器提供的类扫描功能。
JAX-RS应用程序作为Web应用程序打包在.war文件中。 应用程序类打包在WEB-INF/classs或WEB-INF/lib中,而所需的库打包在WEB-INF/lib中。 有关Web应用程序打包的完整详细信息,请参见Servlet规范。
1,使用Servlet的可插拔机制
使用可插拔机制时,必须满足以下条件
1.1 如果不存在Application的子类
如果不存在Application子类,则需要JAX-RS实现来动态添加servlet并将其名称设置为
javax.ws.rs.core.Application,并自动发现必须与应用程序打包在一起的所有根资源类和提供程序。
另外,应用程序必须与web.xml打包在一起,该web.xml为添加的servlet指定servlet映射。 这样的web.xml文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/myresources/*</url-pattern>
</servlet-mapping>
</web-app>
1.2 如果存在Application的子类
-
如果已经有一个处理该应用程序的servlet。 即一个具有参数名为javax.ws.rs.Application值为Application子类完全限定名的Servlet,那么JAX-RS实现不需要任何其他配置步骤。
- 如果没有servlet处理此应用程序,则需要JAX-RS实现来动态添加其完全限定名称必须是Application子类名称的servlet。如果Application子类使用@ApplicationPath注释,则要求实现使用此注释的值附加“ / *”来定义所添加服务器的映射。 否则,必须将应用程序与指定servlet映射的web.xml打包在一起。 例如,如果org.example.MyApplication是应用程序的名称子类,示例web.xml将是:
<web-app version="3.0" 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_3_0.xsd"> <servlet> <servlet-name>org.example.MyApplication</servlet-name> </servlet> <servlet-mapping> <servlet-name>org.example.MyApplication</servlet-name> <url-pattern>/myresources/*</url-pattern> </servlet-mapping> </web-app>
当归档中存在Application子类时,如果Application.getClasses和Application.getSingletons方法都返回一个空集合,那么所有被打包在web应用程序中的根资源类(root resource)和提供程序(provider)必须被JAX-RS的实现通过如上所述描述扫描war文件来自动发现它们。如果getClasses或getSingletons中的任何一个返回非空集合,则仅返回的那些类或单例必须包含在已发布的JAX-RS应用程序中。
下表总结了Servlet 3框架可插拔性机制:
条件(Condition) | 活动(Action) | Servlet名称(Servlet Name) | web.xml |
---|---|---|---|
没有Application子类 | 需要添加Servlet | javax.ws.rs.core.Application | 需要配置servlet的mapping |
Application的子类被存在的Servlet处理 | 无 | (已经定义) | 不需要 |
Application的子类未被存在的Servlet处理 | 需要添加Servlet | Application的子类 | 如果子类没有添加@ApplicationPath注解则需要配置servlet的mapping |
如果未使用Servlet 3框架的可插入性机制(例如在Servlet 3.0之前的容器中),则web.xml描述符的servlet-class或filter-class元素应分别命名为JAX-RS实现提供的servlet或filter类。应使用参数名称为javax.ws.rs.Application的init-param标识Application子类。
请注意,上述Servlet 3框架可插入性机制基于Servlet,而不是过滤器。 倾向于使用JAX-RS实现提供的过滤器类的应用程序必须使用Servlet 3.0之前的配置机制。
标签:JAX,RS,子类,应用程序,Application,Servlet 来源: https://blog.51cto.com/dengshuangfu/2593737