8

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 の「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();
   }
 }

これはおそらく十分な回避策ですが、それでも問題の根底に到達したいと考えています.

4

2 に答える 2

1

コードの目に見える問題の 1 つは、両方の入力マルチパート パラメータ、つまり「ファイル」に同じ名前を使用していることです。

@FormDataParam("file")

マルチパート パラメータには識別子があるため、メソッド シグネチャの 2 番目のオブジェクトに正しい名前を使用する必要があります。それ以外の場合、同じパラメーターが入ってinputstreamおり、FormDataContentDisposition.

于 2013-08-25T16:27:01.723 に答える