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之前的配置机制。

猜你喜欢

转载自blog.51cto.com/dengshuangfu/2593737