【问题标题】:Simple REST service with Jersey running on Servlet 3.0 / Tomcat 7.0 not running but http status 500在 Servlet 3.0 / Tomcat 7.0 上运行 Jersey 的简单 REST 服务未运行但 http 状态为 500
【发布时间】:2013-02-22 19:01:33
【问题描述】:

我正在测试一个非常简单的 REST 服务器,它在 Tomcat 7.0 上使用 Jersey 和 Servlet 3.0 实现。我编写了一个简单的 PoJo:

package toplevel;

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

@Path("/pojo")
public class PoJo {

    @GET
    @Produces("text/plain") 
    public String hello() {

        return "Hello, World"; 
    }
}

我已将以下内容放入 WEB-INF/web.xml 文件(在 Servlet 3.0 上运行):

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<display-name>RestTest</display-name>    

  <servlet> 
    <servlet-name>toplevel.PoJo</servlet-name>
  </servlet>

  <servlet-mapping>
    <servlet-name>toplevel.PoJo</servlet-name>
    <url-pattern>/pojo</url-pattern>
  </servlet-mapping>

</web-app>  

部署时,我收到 HTTP 状态 500 响应。在我看来,网络服务器正在识别应该从 /pojo 提供某些内容,但是找不到相应的类 PoJo。球衣特定 jars(1.17 版)位于 WEB-INF/lib 目录中:

activation-1.1.1.jar   jersey-client-1.17.jar  junit-4.9.jar
asm-3.3.1.jar          jersey-core-1.17.jar    persistence-api-1.0.2.jar
jaxb-api-2.2.4.jar     jersey-server-1.17.jar  stax-api-1.0-2.jar
jaxb-impl-2.2.4-1.jar  jsr311-api-1.1.1.jar

有人认出这个吗?

【问题讨论】:

  • 500 肯定有一些细节吗? (以防万一:不要在 IE 中测试,该浏览器可能会对您隐藏有用的消息。)
  • 感谢您的回复。是的...类型异常报告消息描述服务器遇到一个内部错误,阻止它完成这个请求。异常 java.lang.NullPointerException sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) java.lang.ClassLoader.loadClass(ClassLoader.java:356) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader. java:1629) org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:461)

标签: java rest tomcat jersey


【解决方案1】:

您需要告诉 Jersey 在哪里可以找到您的 REST 资源。您的 web.xml 应该如下所示:

<servlet>
  <servlet-name>Service</servlet-name>
  <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
  <init-param>
    <param-name>com.sun.jersey.config.property.packages</param-name>
    <param-value>toplevel</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Service</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

【讨论】:

  • 感谢您的快速响应,但我认为这是不正确的,因为我使用的是 Servlet 3.0 和 Jersey 1.17。请参阅示例 2.11。在jersey.java.net/nonav/documentation/latest/…上使用带有 Servlet 3.0 的 web.xml 部署 JAX-RS 应用程序
  • 是的 - 但在示例中,资源扩展了 Application。您的资源没有。
  • 嗯.... PoJo 不需要扩展应用程序。您的意思是用于部署没有web.xml....
  • 您需要web.xml。如果您没有定义扩展 Application 的类,则可以使用我提供的 web.xml 示例。见jsr311.java.net/nonav/releases/1.1/javax/ws/rs/core/…
  • 我确实提供了一个 web.xml,见上面的帖子。但我在 Servlet 3.0 上运行,因此不需要包含 &lt;servlet-class/&gt; 属性。
【解决方案2】:

添加 jersey-servlet:1.17.jar 为我解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 2017-12-20
    • 2023-03-16
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多