Jersey - JAX / RS - 如何使用不同的处理程序处理不同的内容类型

时间:2015-02-05 00:24:49

标签: jersey jax-rs

我想使用Jersey / JAX-RS使用不同的处理程序为同一个REST URL处理两种不同的媒体类型。这可能吗?

例如:

@Path("/foo")
public class FooHandler {


    @POST
    @Path("/x")
    @Consumes("application/json")
    public Response handleJson() {
    }

    @POST
    @Path("/x")
    @Consumes("application/octet-stream")
    public Response handleBinary() {
    }

}

1 个答案:

答案 0 :(得分:3)

是的,这是可能的。确定资源方法有很多东西,媒体类型就是其中之一。客户端需要确保在发送请求时设置Content-Type标头。

如果您想了解如何选择资源方法背后的确切科学知识,请阅读3.7 Matching Requests to Resource Methods in the JAX-RS spec。您可以在3.7.2-3.b中具体了解有关媒体类型的部分。

简单测试

@Path("myresource")
public class MyResource {
    @POST
    @Path("/x")
    @Consumes("application/json")
    public Response handleJson() {
        return Response.ok("Application JSON").build();
    }
    @POST
    @Path("/x")
    @Consumes("application/octet-stream")
    public Response handleBinary() {
        return Response.ok("Application OCTET_STREAM").build();
    }
}

@Test
public void testGetIt() {
    String responseMsg = target.path("myresource")
            .path("x").request().post(Entity.entity(null, 
                    "application/octet-stream"), String.class);
    System.out.println(responseMsg);

    responseMsg = target.path("myresource")
            .path("x").request().post(Entity.entity(null, 
                    "application/json"), String.class);
    System.out.println(responseMsg);
}

以上测试将始终打印出来

  

申请书OCTET_STREAM
  应用程序JSON