Jersey REST资源返回HTTP状态405 - 方法不允许

时间:2016-07-02 20:03:53

标签: rest tomcat jersey jersey-2.0

我正在尝试使用Tomcat 7和Jersey 2构建一个简单的REST JSON api .GET全部工作得很好。但是POST / PUT返回了可怕的405.

我知道这是一个很受欢迎的问题。但我已经研究了所有其他答案,他们在我的案例中没有帮助。

我在本地Linux工作站上运行它。我使用真正的Oracle JDK,Eclipse Mars,Tomcat 7和Maven来处理依赖项。

作为同一个应用程序的一部分,我还有一个传统的jsp / servlet接口,可以很好地完成CRUD操作。所以POST正在为servlet工作。

当POST / PUT失败时,在tomcat日志中没有连接的记录。我在Chrome中使用POSTMAN应用生成请求。

我尝试了各种各样的排列,但没有任何影响。我怀疑看代码不会透露一个简单的答案。但它在下面。

有人可以建议一个方法来调试吗?如果它没有在服务器上失败。它在哪里?

非常感谢

我正在使用Servlet 3,因此无需在web.xml中定义它

DAO的所有内容都在运行,所以我会跳过那段代码......

RestApplication.java

package resources;

import javax.ws.rs.ApplicationPath;

import org.glassfish.jersey.server.ResourceConfig;

@ApplicationPath("rest")
public class RestApplication extends ResourceConfig {
    public RestApplication() {
        packages("resources");
    }
}

PersonResource.java

package resources;

import java.util.List;

import javax.ws.rs.Consumes;
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.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.apache.commons.lang3.StringUtils;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;

import dao.PersonDAO;
import model.Person;

@Path("/persons")
public class PersonResource {

    private MongoClientURI cs;
    private MongoClient mc;
    private PersonDAO personDAO;

    public PersonResource() {
        super();

        cs = new MongoClientURI("mongodb://localhost:27017");
        mc = new MongoClient(cs);
        personDAO = new PersonDAO(mc);
    }

    @Path("/")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public List<Person> getPersonsAll() {

        List<Person> persons = personDAO.getAllPerson();
        return persons;
    }

    @Path("/add")
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response addPerson(Person person) {

        personDAO.createPerson(person);
        return Response.status(201).build();
    }

    @Path("/get/{id}")
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Person getPersonById(@PathParam("id") String id) {

        Person person = new Person();
        if (StringUtils.isNotEmpty(id)) {
            person.setId(id);
            person = personDAO.getPerson(person);
        }
        return person;
    }

}

1 个答案:

答案 0 :(得分:1)

由于某种原因,错误405突然变为错误415 - 不支持的媒体类型。然后是因为POSTMAN没有正确设置标题。

然后我尝试了其他Chrome App高级REST客户端...一旦我为application / json指定了标题,一切都开始工作了。

我怀疑这意味着POSTMAN比代码更容易出问题。

有时您必须在SO上提出问题才能找到自己的答案......

感谢收听。