【问题标题】:404 error, Jersey 2.x on tomcat 8404 错误,tomcat 8 上的 Jersey 2.x
【发布时间】:2014-06-10 14:59:04
【问题描述】:

我正在使用 Jersey 2.xtomcat 8 开发我的第一个 RESTful Api,但是当我尝试访问我的资源时,我不断收到 404 错误。

这是我的 web.xml

<?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">

    <servlet>
        <servlet-name>com.pj.api.application.Application</servlet-name>
    </servlet>
    <servlet-mapping>
        <servlet-name>com.pj.api.application.Application</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>
</web-app>

我的应用程序类:

@ApplicationPath ("api")
public class Application extends ResourceConfig {

    public Application () {
        packages ("com.pj.api.resources");
    }   
}

我的资源类:

@Path ("value=/users")
public class UserResources extends ResourcesImpl {

    private UserDao user = new UserDao ();

    @Override
    public List<Data> getList () {
        return user.getList ();
    }

    @GET
    @Path ("value=/test")
    public String Test () {
        return "{'a':'hey'}";
    }

    @Override
    public Data get (String id) {
        return user.get (id);
    }

    @Override
    public void post (Data data) {
        user.post (data);
    }

    @Override
    public void put (Data data) {
        user.put (data);
    }

    @Override
    public void delete(Data data) {
        user.delete (data);
    }
}

在 Tomcat 上部署项目并通过 URL 访问服务时:http://localhost:8080/PJ/api/users/test 它给了我一个 404 错误和Cannot cast org.glassfish.jersey.servlet.init.JerseyServletContainerInitializer to javax.servlet.ServletContainerInitializer

p.s:我不使用 Maven

这可能是什么问题?谢谢。

【问题讨论】:

  • 看起来这是一个类路径问题。你如何运行它?你是部署war文件还是在IDE中部署?
  • @fmucar,我在 Eclipse 中运行项目
  • 检查您的类路径并从类路径中删除所有 servlet-api jar 文件

标签: java rest tomcat jersey


【解决方案1】:

这看起来肯定是类路径问题。您的服务器运行时是否包含一些默认的 Jax-rs 库?尝试在包含 jax-rs 1.1 库的服务器上部署基于 Jersey 2.4 构建的应用程序时,我遇到了类似的问题,因此我不得不在 Jersey 1.18 上重建我的应用程序。检查 Eclipse 中的服务器运行时是否存在任何现有库

【讨论】:

    【解决方案2】:

    您的应用与我的有很大不同。我建议你看一个简单的 hello world 示例,你可以找到 here

    如您所见,一个简单的服务是:

    @Path("/hello")
    public class HelloWorldService {
    
        @GET
        @Path("/{param}")
        public Response getMsg(@PathParam("param") String msg) {
    
             String output = "Jersey say : " + msg;
             return Response.status(200).entity(output).build();
        }
     }
    

    web.xml 应如下所示:

    <web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>Restful Web Application</display-name>
    
    <servlet>
        <servlet-name>jersey-serlvet</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.mkyong.rest</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>jersey-serlvet</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    

    来自projectURL/rest/hello/ 的网络请求将匹配到HelloWorldService@Path("/hello"),来自projectURL/rest/hello/{any values}{any values} 将匹配带有@PathParam 注释的参数。

    网址是http://localhost:8080/&lt;your_project&gt;/rest/hello/Mehdi

    您可以将此基础示例用作根基础并根据您的需要进行调整。

    希望能帮到你

    【讨论】:

    • 感谢您的回答。我正在使用 Jersey 2,我读到它与 Jesrsey1 完全不同
    • @Mehdi 对不起,我的错。在这种情况下,您可以查看this example。如果你愿意,我可以删除我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 2015-06-01
    • 2018-02-04
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多