2013-08-25 3 views
7

Невозможно реализовать простую загрузку файлов с использованием Jersey. Потерялись ошибки зависимостей поднятых при применении начальной загрузке:Невозможно реализовать простую загрузку файлов в Джерси - «аннотируется с POST ресурса, класс не распознается как действительный метод ресурса. Unavailable»

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

} 

я вытащил в "компилировать 'com.sun.jersey.contribs: джерси-многочастному: 1.17.1'" для FormDataParams.

EDIT: Я был в состоянии получить его работу в Джерси, но только в этом более примитивно:

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

Это, вероятно, достаточное временное решение, но все-таки хотелось бы, чтобы добраться до нижней части вопрос.

+0

Я на самом деле работает с аналогичной проблемой. У меня есть соответствующая версия всех необходимых jersey jars, и каждый из моих значений FormDataParam отличается, чтобы избежать будущей проблемы с отображением. Тем не менее, у меня все еще есть проблема с загрузкой. Есть ли проблема с использованием комментариев Post и Produces вместе или что-то еще? Единственный метод, с которым я столкнулся, - это мой пост. –

+0

Было упомянуто мной коллегой, что это известная ошибка, и причина, по которой она работает для некоторых, заключается в том, что она связана с конкретным распределением/конфигурацией, с которой вы работаете. –

+0

Ошибка в том, что именно? Аннотации FormDataParam или Джерси? –

ответ

9

У меня была та же проблема.

Это была проблема с версией (я использовал 1.8 в jersey.multipart и 1.17.1 в остальной части трикотажа). Установка всех из них на 1.17.1 workrd для mee.

Взял мой ответ здесь:

Missing dependency for method when doing a file upload rest web service

+1

Perfecto bro ... отличный ответ, работал как пуля, это та же проблема со мной, я использовал 1.8 и 1.17.1, как отличные (clap) –

1

Одна видна проблема в вашем коде является то, что вы используете то же имя для обоих входных многочастному парам т.е. «файл»

@FormDataParam("file") 

Multipart PARAMS есть идентификатор, так что вы должны использовать правильный имя для второго объекта в вашей сигнатуре метода. В противном случае тот же параметр идет в inputstream, а также для FormDataContentDisposition.

+0

Это имеет смысл, но это проблема начальной загрузки, а не время исполнения. Кроме того, JavaDoc для FormDataParam фактически предлагает использовать «файл» в обоих случаях. –

+0

@rob документ, за которым вы следуете, неверен. Два параметра multipart с таким же именем не могут быть правильно отображены. Попробуйте изменить имя параметров формы в клиенте и использовать одно и то же имя в своем методе. –

+0

Я изменил имена, чтобы вас юморить, и все еще вижу ту же проблему. Помните, что это bootstrap ... клиент не имеет ничего общего с этой проблемой. Это происходит при * запуске * контейнера. Я был бы рад иметь дело с картографическими проблемами на данный момент, но, к сожалению, я еще не был там. :) –

Смежные вопросы