36

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

如果不存在 Application 子类,则添加的 servlet 必须命名为:

javax.ws.rs.core.Application

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

如果存在 Application 子类并且已经定义了一个具有 servlet 初始化参数的 servlet,名为:

javax.ws.rs.Application

同样,这里的“servlet”是什么?

如果存在未被现有 servlet 处理的 Application 子类,则 ContainerInitializer 添加的 servlet 必须使用 Application 子类的完全限定名称命名。

“ContainerInitializer添加的servlet”是否意味着servlet是自动添加的?配置会是什么样子?

目前我既不使用 Application 类也不使用 web.xml 并且它可以工作(使用 GlassFish 3.1)。这种部署机制是否需要完整的类路径扫描,而大型库可能会很慢?

如何部署在 Servlet 容器上?

网络上有许多令人困惑的配置选项。在 web.xml 中使用上下文参数查看此示例(对我不起作用!)。部署 JAX-RS 应用程序的首选方法是什么?

4

4 回答 4

69

部署到 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 应用程序中找到的所有@Path@Provider类都将在“默认”JAX-RS 应用程序中可用,servlet URL 模式为"/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 上返回特定的@Path/@Provider类集,则可能需要执行上述操作(因此您可以在上面拥有第二个具有不同 URL 模式的 MyApplication2)。

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

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

于 2010-07-22T22:57:34.677 回答
5

使用 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>

我的 RestApplication 看起来像:

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>
于 2017-08-28T15:19:53.160 回答
2

使用 Servlet3.0,请遵循此。这对我有用。

<servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>your.restsrv.config.RESTConfig</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <enabled>true</enabled>
    <async-supported>false</async-supported>
</servlet>
<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>
<servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
于 2013-10-09T13:05:29.240 回答
-4

正如我在上面的评论中所说,这完全取决于您要使用的框架。

http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html泽西岛 http://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60 .html用于 RESTeasy

据我所知,JAX-RS 不包含部署规范。

于 2010-01-19T10:05:02.953 回答