6

我的 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>

以下 URL 给了我 Http status 500

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

4 回答 4

9

如果您根本没有注册 JAX-RS servlet 实现,就会发生这种情况web.xml。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;

在您的网络服务课程上。相应地修复或更改它。

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

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

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

于 2012-05-09T16:36:52.403 回答
1

看起来您在错误的位置注册了您的 servlet。仔细检查您的 servlet 的根 URL,并确保它与您点击的内容相匹配。

你试过打吗?:

http://127.0.0.1/hello

请记住,/hello无论您的 servlet 的基本 URL 是什么,它都会出现。尝试在调试器中查看它以查看它的安装位置。

于 2012-05-09T16:29:33.540 回答
1

问题已解决,我就是这样做的。

我从构建路径中删除了球衣 .jar 文件并将它们替换到WEB-INF\lib文件夹中,一切正常。

于 2012-05-11T14:46:18.993 回答
0

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

我从中删除了条目build path并在pom.xml. 像魅力一样工作。

于 2016-08-07T13:12:07.957 回答