Servlet类com.foobar.jaxrs.application.MyApplication不是javax.servlet.Servlet

时间:2015-10-24 20:42:54

标签: java jersey jax-rs

我正在尝试使用Servlet 3.1和Application Subclass配置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)
....

2 个答案:

答案 0 :(得分:3)

嗯,消息说明了一切。您正在尝试部署您的Application子类,它不作为servlet从Servlet扩展。那可能无法奏效。

这不是the Jersey documentation告诉你做事的方式。以下是它的说法:

  

将泽西作为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部署描述符使用Servlet或Servlet过滤器初始化参数,名称为javax.ws.rs.Application [sic],如下所示:

     

例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类。

答案 1 :(得分:1)

我想出了问题 - 我在gradle的jetty插件中运行,它使用servlet 2.5,但我正在部署一个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;
    }
}