我正在使用Jersey客户端来获取用于图像上传功能的PHP Web服务。我得到以下例外:
Caused by: com.sun.jersey.api.client.ClientHandlerException:
A message body writer for Java type, class
com.sun.jersey.multipart.FormDataMultiPart, and MIME media type,
multipart/form-data, was not found
at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:288)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler._invoke(URLConnectionClientHandler.java:204)
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:147)
... 63 more
这是我正在使用的代码:
WebResource webResource = Client.create().resource(HTTP_REST_URI);
JSONObject jSONObj = webResource.queryParams(queryParams)
.type(MediaType.MULTIPART_FORM_DATA)
.post(JSONObject.class, formDataMultiPart);
如何解决此异常?
答案 0 :(得分:12)
创建MultiPartWriter
时注册Client
提供商:
ClientConfig cc = new DefaultClientConfig();
Client client;
cc.getClasses().add(MultiPartWriter.class);
client = Client.create(cc);
如果使用Maven,这些是pom.xml
中所需的依赖项:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.17.1</version>
</dependency>
答案 1 :(得分:9)
Jersey(服务器或客户端)具有支持将Java类型转换为流的提供程序,反之亦然。 您的代码返回(或接收)Java对象,并基于对象的类型和您正在使用的内容类型, 泽西岛寻找合适的提供商进行编组(或解组)。
提供程序实现MessageBodyReader或MessageBodyWriter接口以及每种Java类型和内容类型 您的应用程序使用的组合必须有一个知道如何处理组合的提供者。
您收到的消息告诉您,Jersey无法找到知道如何使用FormDataMultiPart
mime类型封送multipart/form-data
对象的提供程序。你需要提供一个,如果我没有弄错the default implementation is found in the jersey-multipart.jar
and mimepull.jar
files。
答案 2 :(得分:2)
我遇到了同样的问题。它通过将jersey-multipart jar的maven依赖从1.0.2更改为1.8版本来解决(在客户端和提供者端使用相同的依赖。
<dependency>
<groupId>com.sun.jersey.contribs</groupId>
<artifactId>jersey-multipart</artifactId>
<version>1.8</version>
</dependency>
这是我正在使用的完整代码
File file = new File("E:/Goodies/tmp/sparrow.jpg");
byte[] logo = FileUtils.readFileToByteArray(file);
MultiPart multiPart = new MultiPart().bodyPart(new BodyPart(logo, MediaType.APPLICATION_OCTET_STREAM_TYPE));
// POST the request
try{
ClientResponse response = service.type("multipart/mixed").post(ClientResponse.class, multiPart);
System.out.println("Response Status : " + response.getEntity(String.class));
}catch(Exception e){
e.printStackTrace();
}
并在网络服务中:
@POST
@Consumes("multipart/mixed")
@Path("/upload")
public Response post(MultiPart multiPart) {
BodyPartEntity bpe = (BodyPartEntity) multiPart.getBodyParts().get(0)
.getEntity();
boolean isProcessed = false;
String message = null;
try {
InputStream source = bpe.getInputStream();
BufferedImage bi = ImageIO.read(source);
File file = new File("E:/Goodies/tmp" + "123.jpg");
// storing the image to file system.
if (file.isDirectory()) {
ImageIO.write(bi, "jpg", file);
} else {
file.mkdirs();
ImageIO.write(bi, "jpg", file);
}
isProcessed = true;
} catch (Exception e) {
message = e.getMessage();
}
答案 3 :(得分:2)
您需要检查的内容很少
将mimepull.jar添加到您的lib或Maven
`<dependency>
<groupId>org.jvnet.mimepull</groupId>
<artifactId>mimepull</artifactId>
<version>1.9.5</version>
</dependency>`
如果您使用的是文件,请务必在标题处发送内容长度内容类型接受编码
答案 4 :(得分:0)
我在web.xml
中添加了此内容。问题解决了。
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
答案 5 :(得分:0)
这是我的工作:
WebResource webResource =
jerseyClient.resource("www.api.com");
WebResource.Builder requestBuilder = webResource.getRequestBuilder();
requestBuilder.header("content-type", "application/json");
ClientResponse response = requestBuilder
.post(ClientResponse.class, mObjectMapper.writeValueAsString(new RequestObject(longUrl)));
String text = response.getEntity(String.class);
ResponseObject outcome = mObjectMapper.readValue(text, ResponseObject.class);
我已使用Jackson ObjectMapper
序列化请求有效内容,同样使用ResponseObject
将结果反序列化为ObjectMapper
实例。