2013-08-25 44 views
7

Không thể triển khai tệp tải lên đơn giản bằng Jersey. Thiếu các lỗi phụ thuộc được nêu tại bootstrap ứng dụng:Không thể triển khai tệp tải lên đơn giản ở Jersey - "được chú thích bằng POST tài nguyên, lớp không được công nhận là phương thức tài nguyên hợp lệ. Không có"

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) 

Có vẻ như có vấn đề với ánh xạ tham số đầu vào cho dịch vụ REST? Tôi đã đọc tài liệu và làm theo một số ví dụ, và tôi không bị lệch khỏi những ví dụ đó.

Dưới đây là các mã:

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

} 

tôi kéo vào "biên dịch 'com.sun.jersey.contribs: jersey-nhiều phần dữ liệu: 1.17.1'" cho FormDataParams.

EDIT: Tôi đã có thể để có được nó làm việc trong Jersey nhưng chỉ trong này thời trang nguyên thủy hơn:

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

Đây có lẽ là một cách giải quyết đầy đủ, nhưng vẫn muốn có được để dưới cùng của vấn đề.

+0

Tôi đang thực sự chạy vào một vấn đề tương tự. Tôi có cùng phiên bản tương ứng của tất cả các lọ áo yêu cầu, và mỗi giá trị FormDataParam của tôi khác nhau để tránh vấn đề lập bản đồ trong tương lai. Tuy nhiên, tôi vẫn còn có vấn đề bootstrap là tốt. Có vấn đề với việc sử dụng chú thích Đăng và Sản xuất cùng nhau hay gì đó không? Phương pháp duy nhất tôi gặp rắc rối này là bài đăng của tôi. –

+0

Nó đã được đề cập đến với tôi bởi một đồng nghiệp rằng đây là một lỗi đã biết và rằng lý do nó làm việc cho một số là nó phải làm với phân phối/cấu hình cụ thể mà bạn đang làm việc với. –

+0

Một lỗi về chính xác những gì? Chú thích FormDataParam hoặc Jersey? –

Trả lời

9

Tôi đã gặp vấn đề tương tự.

Đó là sự cố phiên bản (tôi muốn 1.8 trong jersey.multipart và 1.17.1 trong phần còn lại của áo). Đặt tất cả chúng thành 1.17.1 workrd cho mee.

Đã trả lời của tôi từ đây:

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

+1

Perfecto bro ... câu trả lời tuyệt vời, làm việc như một viên đạn, đây là vấn đề tương tự với tôi, đã sử dụng 1.8 và 1.17.1 cả hai, tuyệt vời (vỗ tay) –

1

Một vấn đề có thể nhìn thấy trong mã của bạn là, bạn đang sử dụng cùng tên cho cả đầu vào nhiều phần dữ liệu param tức là "tập tin"

@FormDataParam("file") 

params Multipart không có một định danh, vì vậy bạn cần phải sử dụng đúng tên cho đối tượng thứ hai trong chữ ký phương thức của bạn. Nếu không, cùng một tham số sẽ xuất hiện trong inputstream và cũng cho FormDataContentDisposition.

+0

Điều đó làm cho một số ý nghĩa, nhưng đây là một vấn đề bootstrap và không phải là thời gian chạy. Ngoài ra, JavaDoc cho FormDataParam thực sự đề xuất sử dụng "tệp" trong cả hai trường hợp. –

+0

@rob tài liệu bạn đang theo dõi là sai. Hai tham số multipart có cùng tên không thể được ánh xạ chính xác. Hãy thử thay đổi tên của các tham số biểu mẫu trong ứng dụng khách và sử dụng cùng tên trong phương thức của bạn. –

+0

Tôi đã đổi tên để làm hài lòng bạn và vẫn thấy cùng một vấn đề. Hãy nhớ rằng, đây là bootstrap ... khách hàng không có gì để làm với vấn đề này. Nó đang xảy ra tại * khởi động * của container. Tôi sẽ rất vui khi được giao dịch với các vấn đề về bản đồ tại thời điểm này, nhưng tiếc là tôi thậm chí không ở đó. :) –