【问题标题】:How to deploy a JAX-RS application?如何部署 JAX-RS 应用程序?
【发布时间】:2011-01-05 13:11:52
【问题描述】:

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

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

javax.ws.rs.core.Application

添加的 servlet 是什么?会不会是一个任意的 servlet?

如果存在应用程序子类 并且已经定义了一个 servlet 有一个 servlet 初始化 参数命名:

javax.ws.rs.Application

再次,这里的“servlet”是什么?

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

“ContainerInitializer添加的servlet”是指自动添加的servlet吗?配置是什么样的?

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

如何部署在 Servlet 容器上?

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

【问题讨论】:

  • 这肯定取决于您使用的实现吗? Resteasy,泽西岛,?
  • 部署不应该独立于实现吗?我希望能够在不进行修改的情况下将 JAX-RS 应用程序部署到任意 Java EE 6 服务器,就像部署 servlet 应用程序一样。
  • 那么 ContainerInitializer 到底是什么?该规范甚至在第 6 页之前都没有提到它,而且再也没有提到它。

标签: java deployment servlets jax-rs


【解决方案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>

【讨论】:

  • 谢谢! Ik 不得不向后移植一些功能,这种方法奏效了
【解决方案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>

【讨论】:

  • 我收到Broken Link: com.ibm.websphere.jaxrs.server.IBMRestServlet 我找不到包含此类的jar,我可以在哪里找到这个jar
【解决方案3】:

有许多选项可用于部署到 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 类都将在具有 "/rest/*" servlet URL 模式的“默认”JAX-RS 应用程序中可用。

如果您有一个或多个扩展 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)。

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

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

【讨论】:

  • 我在 eclipse Error 404: javax.servlet.UnavailableException: SRVE0200E: Servlet [com.ibm.websphere.jaxrs.server.IBMRestServlet]: Could not find required class - com.ibm.websphere.jaxrs.server.IBMRestServlet Removing the servlet-class from web.xml as this answer修复了它!谢谢
  • 如果没有将“resteasy.scan”属性设置为“true”,您的 web.xml 怎么会这么小,以便自动查找相关资源?难道你还不需要在 web.xml 中列出你所有的资源吗?
  • @Amalgovinus 根据您使用的 servlet 容器环境和运行时,您不必设置特定的运行时属性。这是 Java EE 规范中指定的标准 Java EE JAX-RS 部署配置。
  • 如果 web.xml 本质上是空的,那么您是否需要手动指定类中扩展 Application 的所有可能资源?
  • 如果其他人想知道答案对 ServletContext 的引用,我认为它暗示了 addServlet()。 Tomcat-Jersey 示例:Tomcat 扫描类路径 jar 并找到 META-INf/services 中注册的 (Jersey)ServletContainerInitializer。初始化实现并调用 onStartup(...)。该方法构造 Jerseys ServletContainer,并通过调用 servletContext.addServlet(...) 将其注册到 Tomcat。当调用它的 init() 方法时,它会检索 Application impl。并且(我假设)进行扫描。它现在可以将 URL 映射到 @Path 注释的方法。
【解决方案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 不包含部署规范。

【讨论】:

  • 这是不正确的。 JAX-RS 确实在 Applications/Publication/Servlet 一章中指定了如何以可移植的方式在 Servlet 容器中发布 JAX-RS 应用程序。此外,它还允许实现提供其他设施进行部署。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
相关资源
最近更新 更多