2012-10-21 77 views
0

我在使用Android上的Jersey客戶端API時出現Multipart-form-data POST請求的問題。我一直在關注網絡上的各種示例,它們在實現方面都非常相似。Jersey客戶端+多部分表單數據+ MessageBodyWriter問題

Client client = createClientInstance(); 
WebResource r = client.resource(BASEURL).path("DataUpload"); 
ClientResponse post; 
try { 
    FormDataMultiPart multiPart = new FormDataMultiPart(); 
    multiPart.field("account", account); 
    multiPart.field("checksum", checksum); 
    multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE)); 
    post = r.type(MediaType.MULTIPART_FORM_DATA) 
     .accept(MediaType.TEXT_PLAIN) 
     .post(ClientResponse.class, multiPart); 

} catch (ClientHandlerException e) { 
    Log.e(TAG, e.getLocalizedMessage()); 
} finally { 
    client.destroy(); 
} 

當我執行我的設備上運行此代碼,我帶有一個例外:

javax.ws.rs.WebApplicationException: java.lang.IllegalArgumentException: No MessageBodyWriter for body part of type 'java.io.File' and media type 'application/octet-stream' 

我想澤西本來是要處理的文件對象無需任何額外的配置。去除bodypart線將讓澤西島提出請求,但這消除了這一點。

我有我的構建路徑這些庫(它們用的Maven被拉):

  • 球衣,客戶1.14
  • 球衣核1.14
  • 球衣 - 多1.14
  • mimepull-1-6
+0

http://stackoverflow.com/questions/9710953/trasferring-files-and-data-with-jersey應該有幫助嗎? – smk

+0

看來我的問題與Android的Jersey類加載不正確有關。我正在使用已列出的解決方法[這裏](http://stackoverflow.com/questions/9342506/jersey-client-on-android-nullpointerexception/10676918#10676918)但該解決方案是不完整的,因爲它不是加載所有的我的應用程序需要的類。當我添加[最初列出的完整類](http://jersey.576304.n2.nabble.com/java-lang-NullPointerException-on-Android-tt4212447.html#a5459910)時,它能夠完成上傳文件。 – KC89

回答

0

我可以建議兩件事情嘗試:

  1. 請從FileDataBodyPart建設的MIME類型,看是否新澤西州能找到一個MIME類型是幸福默認爲:

    multiPart.bodyPart(new FileDataBodyPart("file", file, MediaType.APPLICATION_OCTET_STREAM_TYPE));

  2. 告訴你的客戶端配置對多體作家(大概裏面你createClientInstance()法):

    com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig(); 
    config.getClasses().add(MultiPartWriter.class); 
    client = Client.create(config); 
    

希望有所幫助。