Java Rest @GET可以工作,但是@DELETE和@POST路径没有被击中

时间:2016-05-30 20:20:11

标签: java web-services rest client response

我有一个简单的REST客户端,使用GET POST和DELETE方法。

奇怪的是,只有GET方法有效,POST和DELETE都不会被击中,响应是#404; 404 Not Found"当然。

这是我的REST服务和客户端:

接口:

public interface MyInterface {
    @GET
    @Path("/content")
    @Produces(MediaType.APPLICATION_JSON)
    Response getAirports();

    @DELETE
    @Path("/content/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    Response deleteAirport(@PathParam("id") String id);
}

实现:

@Path("/source")
public class SourceService extends AbstractService implements MyInterface {

@Override
    public Response getContent() {
        DBCollection collection = getDBCollection("content");

        DBCursor cursor = collection.find();
        String serialize = JSON.serialize(cursor);

        return Response.status(Response.Status.OK).entity(serialize).build();
    }

    @Override
    public Response deleteContent(@PathParam("id") Integer id) {
        DBCollection collection = getDBCollection("content");

        BasicDBObject query = new BasicDBObject();
        query.append("id", id);

        collection.remove(query);

        return Response.status(Response.Status.OK).build();
    }
}

客户端:

// This is working
public void getContent() {
        WebTarget path = collect.path("/content");
        Response response = path.request().get();
        LOGGER.info("collect.ping: " + response.readEntity(String.class) + "\n");
    }

// This is not working
public void deleteContent(Integer id) {
        WebTarget path = collect.path("/content/"+id);
        Response response = path.request(MediaType.APPLICATION_JSON).delete();
        System.out.println("object deleted:"+response);
    }

我已经尝试过请求球衣或阿帕奇客户,但他们都返回404,我现在就像无望一样。

希望你能指点我。

2 个答案:

答案 0 :(得分:2)

这看起来像是Inheritance with JAX-RS的可能副本。您是否尝试复制子类中的所有注释或者没有,意味着根本不在实现类中使用@PathParam?

答案 1 :(得分:0)

如果您真的可以调试您的客户端,并且您确实能够“单步执行”客户端代码?

如果你在服务器代码中放置一个断点而你实际上从未“破坏”它?然后问题在于您暴露Web服务的方式以及您尝试使用它的方式。

尝试更改服务器所需的参数类型以及从客户端传递的类型。

如果您可以在服务器和客户端上将其更改为更简单的类型..即整数..然后您实际上可以在客户端和服务器中捕获断点,然后您就知道问题出在您的类型中。

我希望你能理解我在说什么?您确实需要简化参数和/或首先不使用参数进行尝试。

当你获得更简单的工作时,你可以将它扩展到其他东西。

尝试将其更改为字符串...例如“airport”此外,您正在客户端传递参数:

            public void deleteAirport(String iata) { 

但您不在客户端代码中使用“iata”...