在JAVA RESTful中删除XMLRootElement失败

在JAVA RESTful中删除XMLRootElement失败,java,json,rest,jersey,Java,Json,Rest,Jersey,好的,我正在使用Jersey用Java构建一个RESTful服务 我已经实现了一个POST,它工作得非常好,在我的数据库的Category表中创建了一个新行。现在,当我尝试执行删除时,我在JSON中传递同一行,但它返回一个“400:Bad Request-由于语法错误,请求无法实现” 我感到困惑,因为JSON是从我在特定类别上执行get时得到的结果复制和粘贴的 以下是相关代码: @Path("/categories/") @Produces(MediaType.APPLICATION_JSON)

好的,我正在使用Jersey用Java构建一个RESTful服务

我已经实现了一个POST,它工作得非常好,在我的数据库的Category表中创建了一个新行。现在,当我尝试执行删除时,我在JSON中传递同一行,但它返回一个
“400:Bad Request-由于语法错误,请求无法实现”

我感到困惑,因为JSON是从我在特定类别上执行get时得到的结果复制和粘贴的

以下是相关代码:

@Path("/categories/")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class CategoryResource {

@POST
public Response addCategory(Category category, @Context UriInfo uriInfo)
{
    JSONArray json_array = category_service.addCategory(category);
    URI uri = uriInfo.getAbsolutePathBuilder().path(category.getCategory_name()).build();
    return Response.created(uri)
            .status(Status.CREATED)
            .entity(json_array.toString())
            .build();
}

@DELETE
public Response deleteCategory(Category category)
{
    System.out.println("Category = " + category.toString());
    category_service.deleteCategory(category);
    return Response.ok().build();
}
system.out.println()永远不会执行,因为它似乎无法对类别进行编码。Category类在这里,充满了常见的getter和setter:

@XmlRootElement
public class Category {

private int category_id;
private String category_name;
private boolean child;
private int parent_id;
private boolean category_state;
private String category_reason;

public Category() {

}
在raw中传递的JSON如下所示:

{
  "category_id": 1,
  "category_name": "tennis",
  "child": true,
  "parent_id": 4,
  "category_state": true,
  "category_reason": "I Like Tennis"
}

请注意,这是从GET…的结果复制和粘贴的

正如peeskillet在评论中明确指出的那样,使用DELETE不提供任何正文。

正如peeskillet在评论中明确指出的那样,使用DELETE不提供任何正文。

某些服务器(例如Grizzly)无法(或需要配置为)使用正文处理DELETE。一般来说,您不需要带有DELETE的主体。在许多情况下,URI中的id应该足以找到要删除的资源。为什么要发送body进行删除操作?没有真正的原因-刚刚用body实现了POST,并且假设删除不会带来任何问题。是否需要很多配置来允许此操作,或者是否将其视为禁止。。。为什么呢?你可以看到。接近本节的最后一段,它说请求中没有有效负载的定义语义,只是一些服务器可能会拒绝它。Grizzly最初就是这种情况,但在一些请求之后,他们将其设置为可配置的。从实际的角度来看,删除资源真正需要的身体的唯一部分是id。即使在ORM框架中,仅仅拥有一个完整的实体并不足以删除它,因为对象没有得到管理。您仍然需要查找它。通常情况下,足够查找它。在大多数情况下,id包含在URI中,或者URI标识符足以查找它。因此,您应该更改要注释的方法,就像对单个资源进行注释一样<代码>@Path(“{id}”)。不确定您使用的是哪台服务器,但仅供参考,如果您使用的是Grizzly,您可以查看的底部了解如何配置。我不确定是否还有其他服务器。某些服务器(例如Grizzly)无法(或需要配置为)使用主体处理删除。一般来说,您不需要带有DELETE的主体。在许多情况下,URI中的id应该足以找到要删除的资源。为什么要发送body进行删除操作?没有真正的原因-刚刚用body实现了POST,并且假设删除不会带来任何问题。是否需要很多配置来允许此操作,或者是否将其视为禁止。。。为什么呢?你可以看到。接近本节的最后一段,它说请求中没有有效负载的定义语义,只是一些服务器可能会拒绝它。Grizzly最初就是这种情况,但在一些请求之后,他们将其设置为可配置的。从实际的角度来看,删除资源真正需要的身体的唯一部分是id。即使在ORM框架中,仅仅拥有一个完整的实体并不足以删除它,因为对象没有得到管理。您仍然需要查找它。通常情况下,足够查找它。在大多数情况下,id包含在URI中,或者URI标识符足以查找它。因此,您应该更改要注释的方法,就像对单个资源进行注释一样<代码>@Path(“{id}”)。不确定您使用的是哪台服务器,但仅供参考,如果您使用的是Grizzly,您可以查看的底部了解如何配置。其他服务器,我不确定。