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

时间:2010-01-15 14:39:12

标签: java deployment servlets jax-rs

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

  

如果没有Application子类   添加的servlet必须命名为:

javax.ws.rs.core.Application

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

  

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

javax.ws.rs.Application

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

  

如果存在Application子类   这不是由一个人处理的   现有的servlet然后是servlet   由ContainerInitializer添加必须   用完全限定名称命名   应用程序子类。

“ContainerInitializer添加的servlet”是否意味着自动添加了servlet?配置如何?

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

如何在Servlet容器上部署?

网络中存在令人困惑的配置选项。看到这个example with context params in the web.xml(对我不起作用!)。部署JAX-RS应用程序的首选方法是什么?

4 个答案:

答案 0 :(得分:61)

有许多选项可用于部署到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>

如果您只希望在网址上返回特定的@Path / @Provider类,那么您可能希望执行上述操作(因此您可以在第二个MyApplication2上使用不同的网址格式)

您也可以完全跳过整个web.xml,只需注释MyApplication@ApplicationPath,该web.xml类将用作网址格式。我建议保留servlet-class,因为你可能不得不在那里添加有关Web应用程序的其他信息。

如果您想知道ServletContext来自何处,它会自动添加到环境中。您可以通过查看Servlet 3.0 {{1}}获得一个想法。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:-3)

正如我在上面的评论中所说,这一切都取决于你想要使用的框架。

泽西岛的

http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html RESTeasy的http://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60.html

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