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

Jersey-JAX/RS-如何使用不同的处理程序处理不同的内容类型,jersey,jax-rs,Jersey,Jax Rs,我想使用Jersey/JAX-RS使用不同的处理程序为相同的RESTURL处理两种不同的媒体类型。这可能吗 例如: @Path("/foo") public class FooHandler { @POST @Path("/x") @Consumes("application/json") public Response handleJson() { } @POST @Path("/x") @Consumes("applica

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

例如:

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


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

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

}

是的,这是可能的。在确定资源方法时需要考虑很多因素,媒体类型就是其中之一。客户端需要确保在发送请求时设置
内容类型

如果您想了解资源方法选择背后的确切科学,您可以阅读。您可以在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);
}
上述测试将始终打印出来

应用八位字节流
应用程序JSON