Jersey @Consumes端点如何匹配?

时间:2015-04-24 21:16:40

标签: java rest jersey jax-rs jersey-2.0

我正在设计一个RESTful端点来接收文件。我想接受POSTing作为普通文件/流和多部分。是否有规则如何与servlet容器匹配端点?下面的代码是否可靠地工作,或者这个实现是否具体?我可以逃避WILDCARD,还是必须将此限制为APPLICATION_OCTET_STREAM?

@Path("foo")
public class Foo {
    @POST
    @Path("{filename}")
    @Consumes(MediaType.WILDCARD)
    public Response uploadFileDirect(
        @PathParam("filename") String filename,
        InputStream is)
    {
        // process input stream
        Response.ok().build();
    }

    @POST
    @Path("{filename}")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    public Response uploadFileMultipart(
        @PathParam("filename") String filename,
        @FormDataParam("file") InputStream is)
    {
        // process input stream
        Response.ok().build();
    }
}

1 个答案:

答案 0 :(得分:3)

这在JAX-RS spec 3.7.2请求匹配

中指定
  

[...]

     

找到资源类/对象,并将所有资源和子资源方法放入集合 M

     

[...]

     
      
  1. 确定将处理请求的方法:   
    一个。通过删除不符合以下条件的成员来过滤 M :   
    [...]   
    湾按降序排序 M ,如下所示:   
    *主键是输入数据的媒体类型。首先对@Consumes值与请求的媒体类型最匹配的方法进行排序。   
    *辅助密钥是@Produces值。首先将@Produces的值与请求接受标头的值最匹配的方法排序。
  2.         

    确定最佳匹配媒体类型遵循一般规则:n/m> n/*> */*,即明确使用请求媒体类型或生成所请求的媒体类型之一的方法在消耗或生成*/*的方法之前进行排序。

如果查看最后一段(确定最佳匹配),则表示*/*MediaType.WILDCARD)的优先级最低。更具体的媒体类型将永远赢得。