【问题标题】:Jersey doesn't find Resources : 404 errorJersey 找不到资源:404 错误
【发布时间】:2014-06-30 13:13:00
【问题描述】:

我正在使用 Jersey 2.10 并在 Tomcat 8 上运行一个简单的 RESTful Api。

这是我的 Application 类:

package com.manager.api.application;

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;

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

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

我的资源包包含:

一个接口:Resources.java

package com.manager.api.resources;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

public interface Resources {

    @GET
    @Produces (MediaType.APPLICATION_JSON)
    public JsonObject getList ();

    @GET
    @Path ("value=/{id}")
    @Produces (MediaType.APPLICATION_JSON)
    public JsonObject get (String id);

    @POST
    @Path ("value=/{data}")
    @Consumes (MediaType.APPLICATION_JSON)
    public void post (JsonObject data);

    @PUT
    @Path ("value=/{data}")
    @Consumes (MediaType.APPLICATION_JSON)
    public void put (JsonObject data);

    @DELETE
    @Path ("value=/{id}")
    public void delete (String id);
}

一个抽象类:ResourcesImpl.java,它实现了 Resources 接口

package com.manager.api.resources;

public abstract class ResourcesImpl implements Resources {  
}

最后是扩展 ResourcesImpl.java 的资源类:UserResources.java

package com.manager.api.resources;

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

import com.manager.api.dao.UserDao;

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

    private UserDao user = new UserDao ();

    @GET
    @Path ("value=/test")
    @Produces (MediaType.TEXT_PLAIN)
    public String Test () {
        return "Test";
    }

    @Override
    public JsonObject getList () {
        return user.getList ();
    }

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

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

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

    @Override
    public void delete(String id) {
        user.delete (id);
    }
}

而我的 web.xml 只包含一个 <display-name> 标签:

<?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>manager-api</display-name>
</web-app>

我成功运行了我的项目,但我遇到了 2 个问题:

已检测到以下警告:警告:HTTP GET 方法 public JsonObject com.manager.api.resources.UserResources.get(java.lang.String) 不应使用任何实体。 :我觉得这很奇怪,因为我输入了@Produces (MediaType.APPLICATION_JSON) 并且没有为这个方法输入@Consumes

最后,最大的问题是当我输入 http://localhost:8080/manager-api/api/users/test 时遇到的 404 错误,它应该将 Test 打印为文本。

您知道这两个错误背后的原因是什么吗?谢谢。

【问题讨论】:

  • 您的 web.xml 中有 &lt;servlet-mapping&gt;&lt;filter-mapping&gt; 标记吗?
  • @Xinzz:谢谢你的回答。不,我没有。官方文档中说:对于简单的部署,根本不需要 web.xml。相反,@ApplicationPath 注释可用于注释自定义 Application 子类并为应用程序中配置的所有 JAX-RS 资源定义基本应用程序 URI。 jersey.java.net/documentation/latest/deployment.html
  • 我知道这是旧的,但您的路径应该采用@Path("/test") 或@Path(value="/test") 格式,而不是@Path("value=/测试”)。

标签: java rest tomcat jersey jersey-2.0


【解决方案1】:

确保你的 pom.xml 有 servlet 3.0 而不是 2.0。还可以尝试在 @ApplicationPath 注释中给出绝对路径而不是相对路径(例如“/api”)。也可能您的包声明对于资源配置不正确?

如果您有更多麻烦,请参阅此: How to set up JAX-RS Application using annotations only (no web.xml)?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2014-12-15
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多