支持Jersey中的Multipart和Application Url编码参数

Mik*_*keb 5 forms multipartform-data jersey

我在泽西岛有休息服务.我想有一些post方法接受参数multipart和url编码.我开始时:

@POST
@Path("/some/resource")
public String addSomeResource(@FormParam("param") String param) {
     repository.add(new SomeResource(param));
}
Run Code Online (Sandbox Code Playgroud)

我的理解是使用@Consumes更狭义地定义了什么是可接受的,并且果然,这个方法被称为是否有人以通常的方式附加表单数据

$.ajax({url:'/some/resource', type:'POST', data:'&param=foo'});
Run Code Online (Sandbox Code Playgroud)

或者通过多部分表单提交(来自某个Java客户端包装http客户端).

但是当它通过multipart进入时 - 映射不会发生并且param为空.我假设这是因为它期望a @FormDataParam而不是@FormParam方法中的a - 但我也相信我只能@FormDataParam在我更简单地将Consumes定义为Multipart-only时使用.FormDataParam(http://jersey.java.net/nonav/apidocs/1.5/contribs/jersey-multipart/com/sun/jersey/multipart/FormDataParam.html)的文档似乎暗示如果没有多部分参数FormDataParam可以回退FormData在那儿.

我目前的解决方案是为每个帖子选项提供两种方法:

@POST
@Path("/some/resource")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public String addSomeResource(@FormParam("param") String param) {
     repository.add(new SomeResource(param));
}
@POST
@Path("/some/resource")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String addSomeResourceMP(@FormDataParam("param") String param) {
     return addSomeResource(param);
}
Run Code Online (Sandbox Code Playgroud)

这似乎可能有用,但我想知道我是否只是误解了一些更基本的东西,或者错过了一个更好的不同修复.