Jersey REST WS错误:"方法缺少依赖项...在第X个参数处"

9
我遇到了以下错误:
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数据(文件上传)以及来自提交表单的其他字符串数据字段,以下是代码:

@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个回答

13

在谷歌搜索一番后,我发现了一些有趣的案例,例如@FormParam失败的反编译问题或者缺少Multipart JAR依赖关系问题,最接近我的问题的帖子是这个:"方法缺失依赖项",我会用这篇文章中的链接进行回答,因为我没有看到当前针对那个特定问题的解决方案。

问题似乎与@FormDataParam注释有关,在使用值为MediaType.APPLICATION_FORM_URLENCODED的方法级别的@Consumes注释时出现。

当我将方法签名更改为使用@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时进行配置。希望这可以帮助你。

4

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

1)您需要将所有jersey依赖项放置在相同的版本下。

2)我还遇到了swagger注释@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) {...}

1

参考:在我的情况下,是依赖项jersey-multipart使用了与其他Jersey库不同的版本,导致在处理多部分表单数据时出现此错误。--> 确保所有Jersey库使用相同的版本号!(mvn dependency:tree是您的好朋友)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接