Jersey Client + Multipart表单数据+ MessageBodyWriter问题

时间:2012-10-21 22:55:54

标签: android jersey jax-rs multipartform-data

我在Android上使用Jersey客户端API遇到了Multipart-form-data POST请求的问题。我一直在网上关注各种各样的例子,它们在实施方面都非常相似。

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'

我认为Jersey应该在没有任何额外配置的情况下处理File对象。删除bodypart行将允许Jersey发出请求,但这消除了这一点。

我的构建路径上有这些库(使用Maven引入):

  • jersey-client-1.14
  • jersey-core-1.14
  • Jersey的多-1.14
  • mimepull-1-6

1 个答案:

答案 0 :(得分:0)

我可以建议尝试两件事:

  1. 从FileDataBodyPart构造中删除MIME类型,以查看Jersey是否可以找到默认为默认的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);
    
  3. 希望有所帮助。