泽西岛你好世界给了404

时间:2012-05-09 16:07:06

标签: java tomcat jersey

我的java类中有以下代码

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class Hello {
    //This method is called is TEXT_PLAIN is request
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String sayPlainTextHello(){
        return "Hello World";
    }

    //this method is called if TEXT_XML is requested
    @GET
    @Produces(MediaType.TEXT_XML)
    public String sayXMLHello(){
        return "<?xml version=\"1.0\"?>"+"<Hello> Hello World"+"</hello>";
    }

    //this method is called if HTML is requested
    @GET
    @Produces(MediaType.TEXT_HTML)
    public String sayHtmlHello(){
        return "<html>"+"<title>"+"hello jersey"+"</title>"+"<body><h1>"+"hello World!!"+"</body></h1>"+"</html>";
    }
}

当我输入

时,我将其编译并导出为.WAR文件
  

http://127.0.0.1/test_server/hello

我得到了404。我在WTP中试过它,cURL它们都返回404 ..我正在使用tomcat 7.0.26

注意:我在端口80上运行Tomcat,其他servlet按预期响应。

web.xml配置

<display-name>Jersey_Test</display-name>
  <servlet>
    <servlet-name>Hello</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>com.example.service</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>Hello</servlet-name>
    <url-pattern>/*</url-pattern>

以下网址为我提供了Http状态500

 http://localhost/Jersey_Test/rest/hello
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer 

4 个答案:

答案 0 :(得分:9)

如果您尚未在web.xml中注册JAX-RS servlet实现,则会发生这种情况。 Jersey需要以下配置:

<servlet>
    <servlet-name>jersey</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>com.example.service</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>  

com.sun.jersey.config.property.packages初始化参数值必须指向您所有服务所在的包。但是,您的代码段缺少package声明。我不确定是否为了简洁而省略了这一点,但无包装类对于本身位于包中的类是不可见的(例如Tomcat和Jersey引擎本身)。上面的web.xml示例假定您已经

package com.example.service;

在您的Web服务类上。相应地修复或更改它。

请注意,/*的URL模式因此意味着所有请求都将通过Jersey传递。如果您需要在同一个Web应用程序中部署其他servlet,JSP或静态内容,则可能需要指定更具体的URL模式。 E.g。

<url-pattern>/rest/*</url-pattern>

您只需将请求网址更改为http://localhost/test_server/rest/hello

答案 1 :(得分:2)

问题已得到修复,我就是这样做的。

我从构建路径中删除了jersey .jar文件,并将其替换为WEB-INF\lib文件夹,一切正常。

答案 2 :(得分:1)

看起来您正在错误的地方注册您的servlet。仔细检查servlet的根URL,并确保它符合您的要求。

你试过点击吗?:

http://127.0.0.1/hello

请记住,/hello将跟随您的servlet的基本URL。尝试在调试器中查看它以查看它的安装位置。

答案 3 :(得分:0)

对我来说,jar中添加了一个Build path -> Libraries文件,文件系统中缺少实际的jar

我从build path删除了该条目,并在pom.xml中添加了依赖项。 像魅力一样工作。