Java 无法在Jersey中实现简单的文件上载-";用资源的POST注释,类不能被识别为有效的资源方法。“不可用”;

Java 无法在Jersey中实现简单的文件上载-";用资源的POST注释,类不能被识别为有效的资源方法。“不可用”;,java,rest,jersey,Java,Rest,Jersey,无法使用Jersey实现简单的文件上载。应用程序引导时引发的缺少依赖项错误: 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.foo.MyResource.uploadFile(java.io.InputStr

无法使用Jersey实现简单的文件上载。应用程序引导时引发的缺少依赖项错误:

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.foo.MyResource.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at parameter at index 0
  SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.foo.MyResource.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition) at parameter at index 1
  SEVERE: Method, public javax.ws.rs.core.Response com.foo.uploadFile(java.io.InputStream,com.sun.jersey.core.header.FormDataContentDisposition), annotated with POST of resource, class com.foo.FS2Resource, is not recognized as valid resource method.
unavailable
com.sun.jersey.spi.inject.Errors$ErrorMessagesException
    at com.sun.jersey.spi.inject.Errors.processErrorMessages(Errors.java:170)
将输入参数映射到REST服务似乎有问题?我已经阅读了文档并遵循了几个示例,我没有偏离这些示例

代码如下:

@Path("v1/")
public class FileUploadResource {


    @POST
    @Path("upload")
    @Consumes(MediaType.MULTIPART_FORM_DATA)
    @Produces({MediaType.APPLICATION_JSON})
    public Response uploadFile(
        @FormDataParam("file") InputStream is,
        @FormDataParam("file") FormDataContentDisposition detail) {

        String name = detail.getFileName();

        // do upload stuff
        String output = .... 

        return Response.status(200).entity(output).build();
    }

}
我为FormDataParams输入了“compile'com.sun.jersey.contribs:jersey multipart:1.17.1”

编辑:我能够在泽西岛上使用它,但只是以更原始的方式:

 @POST
 @Path("upload")
 @Consumes(MediaType.MULTIPART_FORM_DATA)     
 @Produces(MediaType.TEXT_PLAIN)

 public Response uploadFile(final MimeMultipart file) {
   if (file == null) {
     return Response.status(Response.Status.BAD_REQUEST).entity("Must supply a valid file").build();

   try {
     for (int i = 0; i < file.getCount(); i++) {
       // ... do something with file.getBodyPart(i));
     }
     return Response.ok("done").build();
   } catch (final Exception e) {
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e).build();
   }
 }
@POST
@路径(“上传”)
@使用(MediaType.MULTIPART\u FORM\u数据)
@生成(MediaType.TEXT\u PLAIN)
公共响应上载文件(最终MimeMultipart文件){
if(file==null){
返回Response.status(Response.status.BAD_REQUEST).entity(“必须提供有效文件”).build();
试一试{
对于(int i=0;i

这可能是一个足够的解决方法,但仍希望弄清问题的根源。

代码中一个明显的问题是,您对两个输入多部分参数使用相同的名称,即“file”


多部分参数确实有一个标识符,因此您需要为方法签名中的第二个对象使用正确的名称。否则,
inputstream
FormDataContentDisposition
中会出现相同的参数。我也遇到了同样的问题

这是一个版本问题(我在jersey.multipart中使用了1.8,在jersey的其余部分中使用了1.17.1)。为mee将所有这些设置都设置为1.17.1 workrd

我的回答如下:


这是有道理的,但这是一个引导问题,而不是运行时问题。此外,JavaDoc for FormDataParam实际上建议使用“文件”在这两种情况下。@rob您正在跟踪的文档都是错误的。两个具有相同名称的多部分参数无法正确映射。请尝试在客户端中更改表单参数的名称,并在您的方法中使用相同的名称。我更改名称是为了取笑您,但仍然看到相同的问题。请记住,这是引导…客户端与此问题无关。这是在容器启动时发生的。在这一点上,我很乐意处理映射问题,但不幸的是我还没有到。))这是一个引导问题而不是运行时错误:泽西引导程序是运行时,不是编译时间。但是我在引导程序中得到同样的问题,而且每个PAR都有不同的名称。t、 我也在使用相同的版本,但仍然有相同的问题,知道吗?显然,我说的是使用@FormDataParam,我实际上遇到了类似的问题。我所有必需的jersey JAR都有相同的对应版本,我的每个FormDataParam值都不同,以避免将来的映射问题。但是,我仍然有还有引导问题。一起使用Post和生成批注有问题吗?我唯一遇到这种问题的方法是我的Post one。一位同事向我提到,这是一个已知的错误,它对某些人有效的原因是它与我使用的特定分发/配置有关你正在处理。一个关于什么的错误,确切地说?FormDataParam注释或Jersey?相同的解决方案,谢谢。Perfecto bro…很好的答案,像子弹一样工作,这与我是同一个问题,都使用了1.8和1.17.1,很好(clap)
@FormDataParam("file")