8

私はJerseyクライアントを使用して、画像アップロード機能用のPHPWebサービスを利用しています。次の例外が発生します。

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

この例外はどのように解決できますか?

4

6 に答える 6

9

Jersey (サーバーまたはクライアント) には、Java 型からストリームへの変換、およびその逆の変換をサポートするプロバイダーがあります。コードは Java オブジェクトを返し (または受け取り)、オブジェクトのタイプと使用しているコンテンツ タイプに基づいて、Jersey は適切なプロバイダーを探してマーシャリング (またはアンマーシャリング) を行います。

プロバイダーはMessageBodyReaderまたはMessageBodyWriterインターフェースを実装し、アプリケーションが使用するすべての Java タイプとコンテンツ タイプの組み合わせに対して、組み合わせを処理する方法を知っているプロバイダーが必要です。

表示されるメッセージは、Jersey がMIME タイプでFormDataMultiPartオブジェクトをマーシャリングする方法を知っているプロバイダーを見つけられないことを示しています。multipart/form-data1つ提供する必要があります。私が間違っていなければ、デフォルトの実装はjersey-multipart.jarand mimepull.jarfilesにあります。

于 2013-03-23T16:51:59.420 に答える
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();
}

およびWebサービスで:

@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();
    }
于 2013-06-30T05:52:13.070 に答える
2

あなたが確認する必要があるいくつかのことがあります

mimepull.jar を lib または Maven に追加します

`<dependency>
    <groupId>org.jvnet.mimepull</groupId>
    <artifactId>mimepull</artifactId>
    <version>1.9.5</version>
</dependency>`

また、ファイルを操作している場合は、必ずヘッダーでcontent-length content-type accept-encodingを送信してください

于 2015-06-04T10:49:10.237 に答える
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);

JacksonObjectMapperを使用してリクエスト ペイロードをシリアライズし、同様にResponseObjectを使用して結果をインスタンスにデシリアライズしましたObjectMapper

于 2018-03-16T00:22:20.730 に答える