如何部署 JAX-RS 应用程序?

2022-09-01 05:50:17

JAX-RS 1.1 规范在第 6 页上说:

如果不存在应用程序子类,则必须将添加的 servlet 命名为:

javax.ws.rs.core.Application

添加的 servlet 是什么?它可能是任意的 servlet 吗?

如果存在应用程序子类,并且已经定义了一个 servlet,该 servlet 具有名为:

javax.ws.rs.Application

再说一遍,这里的“servlet”是什么?

如果存在未由现有 servlet 处理的应用程序子类,则容器初始化程序添加的 servlet 必须使用 Application 子类的完全限定名称命名。

“容器初始化程序添加的 servlet”是否意味着自动添加 servlet?配置是什么样的?

目前,我既不使用应用程序类也不使用Web.xml并且可以工作(使用GlassFish 3.1)。此部署机制是否需要完整的类路径扫描,而对于大型库,这可能很慢?

如何在 Servlet 容器上部署?

Web 中存在许多令人困惑的配置选项。请参阅此示例,其中包含 Web 中的上下文参数.xml(对我不起作用!部署 JAX-RS 应用程序的首选方法是什么?


答案 1

有许多选项可用于部署到 Java EE 6 容器中(更具体地说是 Servlet 3.0 实现):

最简单的是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>javax.ws.rs.core.Application</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

然后,在 Web 应用程序中找到的所有 和 类都将在“缺省”JAX-RS 应用程序中可用,其 servlet URL 模式为 。@Path@Provider"/rest/*"

如果您有一个或多个扩展的类,则可以按如下方式指定:javax.ws.rs.core.Application

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
    <servlet>
        <servlet-name>com.example.jaxrs.MyApplication</servlet-name>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.example.jaxrs.MyApplication</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
</web-app>

如果您只想在URL上返回特定的/类集,您可能希望执行上述操作(因此您可以在上面使用具有不同URL模式的第二个MyApplication2)。@Path@Provider

您也可以完全跳过整个,只需注释您的类,这将用作URL模式。无论如何,我建议保留,因为无论如何,您可能都必须添加有关Web应用程序的其他信息。web.xmlMyApplication@ApplicationPathweb.xml

如果您想知道它来自哪里,它会由环境自动添加进来。您可以通过查看Servlet 3.0来获得一个想法。servlet-classServletContext


答案 2

在 WAS 8.5 中,我更改了 web.xml 以添加:

<servlet>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.tada.rest.RestApplication</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

我的 Rest 应用程序如下所示:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

public class RestApplication extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> sets = new HashSet<Class<?>>();
        sets.add(RestService.class);
        return sets;
    }
}

我的 RestService 看起来像

@Path("/tada")
public class RestService {
    @GET
    public String getSomething() {
        return "tada";
    }
}

我添加了 pom.xml依赖关系:

<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.0</version>
</dependency>

推荐