【问题标题】:Java Rest @GET works but @DELETE and @POST paths doesn't get hitJava Rest @GET 有效,但 @DELETE 和 @POST 路径未命中
【发布时间】:2016-05-30 20:20:11
【问题描述】:

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

奇怪的是只有 GET 方法有效,POST 和 DELETE 都没有被命中,而且响应当然是“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);
    }

我尝试过向 jersey 或 apache 客户端请求,但它们都返回 404,我现在已经绝望了。

希望你能给我一个方向。

【问题讨论】:

  • 尽量减少你的问题。使实现立即返回 OK 响应。
  • @Chill 刚刚尝试删除 PathParam,它被击中并返回 OK。那个怎么样?我是否以错误的方式发送路径参数?
  • 尝试将其更改为字符串...例如“airport” 此外,您正在客户端中传递一个参数,如下所示: public void deleteAirport(String iata) { 但你不使用客户端代码中的“iata”...
  • @Chill 再次尝试了它没有击中......它只有在没有 PathParam 存在时才会击中。我应该以不同的方式处理 PathParam 吗?
  • 请评论我的回答。

标签: java web-services rest client response


【解决方案1】:

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

【讨论】:

  • 哇!我整天都在为此烦恼,而您刚刚保存了它...非常感谢,我真的很感激!
【解决方案2】:

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

如果您在您的服务器代码中放置了一个断点,但您从未真正“中断”它?那么问题在于您公开 Web 服务的方式以及您尝试使用它的方式。

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

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

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

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

尝试将其更改为字符串...例如“机场”此外,您正在客户端中传递一个参数,如下所示:

            public void deleteAirport(String iata) { 

但是您没有在客户端代码中使用“iata”...

【讨论】:

  • 刚刚尝试过,它在没有任何 PathParam 的情况下也可以工作,但是当添加任何东西作为 PathParam 时,它就不再工作了......我该怎么办?该方法只是一种客户端测试方法,尝试使用参数但没有运气......
  • 你能设置断点吗?在服务器或客户端?还是两者兼而有之?
  • 现在 OP 将行更改为: // 这不起作用 public void deleteContent(Integer id) { 因此我原来的建议不再有意义 :) 似乎调试建议可能对某人有所帮助否则……
猜你喜欢
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
相关资源
最近更新 更多