Jersey REST WS错误:“缺少方法的依赖...在索引X处的参数”

时间:2013-04-09 18:41:07

标签: java rest jersey media-type

我收到以下错误:

Apr 09, 2013 12:24:26 PM com.sun.jersey.spi.inject.Errors processErrorMessages
SEVERE: The following errors and warnings have been detected with resource and/or provider classes:
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 0
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 1
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 2
SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String) at parameter at index 3
SEVERE: Method, public javax.ws.rs.core.Response com.package.ImportService.specifyLocalFile(java.lang.String,java.lang.String,java.lang.String,java.lang.String), annotated with POST of resource, class com.package.ImportService, is not recognized as valid resource method.

我有一个以前工作的POST方法,它接受Multipart数据(文件上传),然后从提交的表单中获取其他一些String数据字段,这里是代码:

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadFile(
    @FormDataParam("file") InputStream uploadedInputStream,
    @FormDataParam("file") FormDataContentDisposition fileDetail,
    @FormDataParam("param1") String param1,
    @FormDataParam("param2") String param2,
    @FormDataParam("param3") String param3) {
    ....
    ....
    return Response.status(200).entity(getEntity()).build();
}

该错误似乎与Jersey对表单参数的解释方式有关。这是失败的代码:

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("/local")
public Response specifyLocalFile(
    @FormDataParam("file") String fullFilePath,
    @FormDataParam("param1") String param1,
    @FormDataParam("param2") String param2,
    @FormDataParam("param3") String param3) {
    ....
    ....
    return Response.status(200).entity(getEntity()).build();
}

3 个答案:

答案 0 :(得分:11)

点击谷歌后,我最终审核了一些有趣的案例,例如Failed unmarshalling issue with @FormParamMissing mulipart JAR dependency issue,我问题的最近似的帖子就是:"Missing dependecy for method",我回答的是链接到这个POST,因为我看不到那个特定的解决方案。

该问题似乎与@FormDataParam注释有关,当与方法级@Consumes注释一起使用时,值为MediaType.APPLICATION_FORM_URLENCODED

当我更改Method签名以使用@FormParam注释每个纯文本字段时,异常消失了。检查下面的固定代码:

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Path("/local")
public Response specifyLocalFile()
    @FormParam("file") String fullFilePath,
    @FormParam("param1") String param1,
    @FormParam("param2") String param2,
    @FormParam("param3") String param3) {
    ....

如果收到的数据类型不必处理MIME编码,@FormParam注释将尝试通过序列化处理内容;相反,@FormDataParam注释需要在@Consumes注释具有MediaType.MULTIPART_FORM_DATA时配置的某些特定处理。希望这会有所帮助。

答案 1 :(得分:3)

我的项目遇到了同样的错误。

1)您需要将所有球衣依赖关系放在同一版本中。

2)由于昂首阔步的旋转,我也有问题@ApiParam:

@ApiParam(value = "import file", required = true) @FormDataParam("file") InputStream inputStreamCsv

删除它们就可以了:

@FormDataParam("file") InputStream inputStreamCsv

这是提及问题的链接:https://github.com/swagger-api/swagger-core/issues/1530

最后,一切都有用:

@POST
@Path("/import")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response import(
        @FormDataParam("file") InputStream inputStreamCsv,
        @FormDataParam("file") FormDataContentDisposition detailsFichier) {...}

答案 2 :(得分:0)

供参考:在我的情况下,这是依赖性jersey-multipart,它与其他Jersey库使用的版本不同,导致与多部分表单数据有关的此错误。 ->确保所有Jersey库都使用相同的版本号! (mvn dependency:tree是你的朋友)