Servlet class com.foobar.jaxrs.application.MyApplication 不是 javax.servlet.Servlet
Servlet class com.foobar.jaxrs.application.MyApplication is not a javax.servlet.Servlet
我正在尝试使用 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)
....
好吧,消息说明了一切。您正在尝试将您的应用程序 subclass 部署为 servlet,它不是从 Servlet 扩展而来的。这不可能行得通。
这不是 the Jersey documentation 告诉我们做事的方式。内容如下:
Hooking up Jersey as a 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 class 是 org.glassfish.jersey.servlet.ServletContainer
。不是您的自定义应用程序 subclass.
Custom Application subclass
If you extend the Application class to provide the list of relevant root resource classes (getClasses()) and singletons (getSingletons()), i.e. your JAX-RS application model, you then need to register it in your web application web.xml deployment descriptor using a Servlet or Servlet filter initialization parameter with a name of javax.ws.rs.Application [sic] as follows:
Example 4.11. Configuring Jersey container Servlet or Filter to use custom Application subclass
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.foo.MyApplication</param-value>
</init-param>
请注意,自定义应用程序 subclass 被配置为 servlet 的初始参数。不像 servlet class.
我发现了问题 - 我在 gradle 的码头插件中 运行 使用 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;
}
}
我正在尝试使用 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)
....
好吧,消息说明了一切。您正在尝试将您的应用程序 subclass 部署为 servlet,它不是从 Servlet 扩展而来的。这不可能行得通。
这不是 the Jersey documentation 告诉我们做事的方式。内容如下:
Hooking up Jersey as a 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 class 是 org.glassfish.jersey.servlet.ServletContainer
。不是您的自定义应用程序 subclass.
Custom Application subclass
If you extend the Application class to provide the list of relevant root resource classes (getClasses()) and singletons (getSingletons()), i.e. your JAX-RS application model, you then need to register it in your web application web.xml deployment descriptor using a Servlet or Servlet filter initialization parameter with a name of javax.ws.rs.Application [sic] as follows:
Example 4.11. Configuring Jersey container Servlet or Filter to use custom Application subclass
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>org.foo.MyApplication</param-value>
</init-param>
请注意,自定义应用程序 subclass 被配置为 servlet 的初始参数。不像 servlet class.
我发现了问题 - 我在 gradle 的码头插件中 运行 使用 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;
}
}