【问题标题】:Servlet class com.foobar.jaxrs.application.MyApplication is not a javax.servlet.ServletServlet 类 com.foobar.jaxrs.application.MyApplication 不是 javax.servlet.Servlet
【发布时间】:2015-10-24 20:42:53
【问题描述】:

我正在尝试使用 Servlet 3.1 和应用程序子类来配置 Jersey。一段时间以来一直在阅读文档并试图解决这个问题,但我不确定这里出了什么问题。

web.xml(虽然我不应该需要一个我得到一个没有一个的 404...)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">

<display-name>Foobar Models</display-name>

<welcome-file-list>
    <welcome-file>index.htm</welcome-file>
</welcome-file-list>

<session-config>
    <session-timeout>30</session-timeout>
    <cookie-config>
        <name>SESSIONID</name>
    </cookie-config>
</session-config>

<servlet>
    <servlet-name>Foo Bar Application</servlet-name>
    <servlet-class>com.foobar.jaxrs.application.FooBarApplication</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Foo Bar Application</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

</web-app>

应用子类

package com.foobar.jaxrs.application;

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

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/api")
public class FooBarApplication extends Application {
public Set<Class<?>> getClasses() {
    Set<Class<?>> s = new HashSet<Class<?>>();
    s.add(com.foobar.api.HealthCheckResource.class);
    return s;
}
}

HealthCheckResource.java

package com.foobar.api;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Path("health")
public class HealthCheckResource {

    @GET
    @Produces("text/html")
    public String getHeath() {
        return "Foo Bar Application is healthy!";
    }

}

在码头运行(在 Tomcat 8 中相同)

HTTP ERROR 404

Problem accessing /foobar/api/health. Reason:

    Servlet class com.foobar.jaxrs.application.FooBarApplication is not a javax.servlet.Servlet
Caused by:

javax.servlet.UnavailableException: Servlet class com.foobar.jaxrs.application.FooBarApplication is not a javax.servlet.Servlet
    at org.mortbay.jetty.servlet.ServletHolder.checkServletType(ServletHolder.java:362)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:243)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
....

【问题讨论】:

    标签: java jersey jax-rs


    【解决方案1】:

    嗯,消息说明了一切。您正在尝试将不从 Servlet 扩展的 Application 子类部署为 servlet。那是不可能的。

    这不是the Jersey documentation 告诉我们做事的方式。它是这样说的:

    将 Jersey 连接为 Servlet

    <web-app>
        <servlet>
            <servlet-name>MyApplication</servlet-name>
            <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
            <init-param>
                ...
            </init-param>
        </servlet>
        ...
        <servlet-mapping>
            <servlet-name>MyApplication</servlet-name>
            <url-pattern>/myApp/*</url-pattern>
        </servlet-mapping>
        ...
    </web-app>
    

    请注意,servlet 类是org.glassfish.jersey.servlet.ServletContainer。不是您的自定义应用程序子类。

    自定义应用子类

    如果您扩展 Application 类以提供相关根资源类 (getClasses()) 和单例 (getSingletons()) 的列表,即您的 JAX-RS 应用程序模型,那么您需要在您的 Web 应用程序 web 中注册它.xml 部署描述符使用名称为 javax.ws.rs.Application [sic] 的 Servlet 或 Servlet 过滤器初始化参数,如下所示:

    示例 4.11。配置 Jersey 容器 Servlet 或 Filter 以使用自定义 Application 子类

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>org.foo.MyApplication</param-value>
    </init-param>
    

    请注意,自定义 Application 子类被配置为 servlet 的 init-param。不像 servlet 类。

    【讨论】:

      【解决方案2】:

      我发现了问题 - 我在使用 servlet 2.5 的 gradle 的 jetty 插件中运行,但我正在部署一个 servlet 3.1 应用程序。在使用正确配置部署到 Tomcat 8 后,我能够在没有 web.xml 的情况下使其工作。

      它仍然不适用于 Jetty(需要获取更新版本的 jetty),但在 Tomcat 8 中可以:

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns="http://xmlns.jcp.org/xml/ns/javaee"
          xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
          id="WebApp_ID" version="3.1">
      
          <display-name>Foo Bar Models</display-name>
      
          <welcome-file-list>
              <welcome-file>index.htm</welcome-file>
          </welcome-file-list>
      
      </web-app>
      

      BaseApplication.java 包 com.foobar.jaxrs.application;

      import java.util.HashSet;
      import java.util.Set;
      
      import javax.ws.rs.ApplicationPath;
      import javax.ws.rs.core.Application;
      
      @ApplicationPath("")
      public class BaseApplication extends Application {
      
          @Override
          public Set<Class<?>> getClasses() {
              Set<Class<?>> s = new HashSet<Class<?>>();
              s.add(com.patrickkee.resources.HealthCheckResource.class);
              return s;
          }
      }
      

      【讨论】:

      • 原始 web.xml 的问题在于 Application 类应该被声明为 &lt;servlet-name&gt; 而不是 &lt;servlet-class&gt;。参见示例4.16 and 4.18。但是是的,没有 web.xml 也可以工作:-)
      猜你喜欢
      • 2013-04-05
      • 2018-12-19
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多