2013-03-23 10 views
6

Sto utilizzando il client Jersey per accedere a un servizio Web PHP per la funzionalità di caricamento delle immagini. Sto ottenendo il seguente eccezione:Eccezione client Jersey: non è stato trovato uno scrittore del corpo del messaggio

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 

Questo è il codice che sto usando:

WebResource webResource = Client.create().resource(HTTP_REST_URI); 
JSONObject jSONObj = webResource.queryParams(queryParams) 
     .type(MediaType.MULTIPART_FORM_DATA) 
     .post(JSONObject.class, formDataMultiPart); 

Come può questa eccezione essere risolti?

+0

può si prega di condividere un po 'di codice ... come come si crea il modulo .In situazioni normali il codice avrebbe funzionato .. – mvlupan

risposta

8

Jersey (server o client) dispone di provider che supportano la conversione di un tipo Java in un flusso e viceversa. Il codice restituisce (o riceve) un oggetto Java e in base al tipo di oggetto e al tipo di contenuto utilizzato, Jersey cerca un provider appropriato per eseguire il marshalling (o unmarshalling).

I fornitori di attuare le MessageBodyReader o MessageBodyWriter interfacce e per ogni Java tipo e il contenuto di tipo combinazione l'applicazione utilizza è necessario disporre di un provider che sa come gestire la combinazione.

I messaggi che stai ricevendo ti dicono che Jersey non riesce a trovare un provider che sappia come effettuare il marshalling di un oggetto FormDataMultiPart con un tipo di mimo multipart/form-data. È necessario fornire uno e, se non mi sbaglio, the default implementation is found in the jersey-multipart.jar and mimepull.jar files.

+2

Assicurarsi di utilizzare la versione di 'jersey-multipart' che corrisponde alla versione di 'jersey-core'. –

+0

La chiave che il controllo delle versioni potrebbe trovarsi nella versione/META-INF/jersey-module. Ogni file jar in jersey ha questo file e ho il sospetto che debbano combaciare tutti. Una volta ho ottenuto tutti i miei vasi per essere della stessa versione. Il file mimepull.jar non ha questo, ma dovrebbe corrispondere a quello che si trova nella dipendenza jersey-multipart.jar pom.xml. – user2708344

2

Ho affrontato lo stesso problema. Ha ottenuto risolto modificando esperto di dipendenza per vaso jersey-multipart da 1.0.2 a 1.8 Versione (ha usato la stessa dipendenza nel lato client e lato fornitore.

   <dependency> 
       <groupId>com.sun.jersey.contribs</groupId> 
       <artifactId>jersey-multipart</artifactId> 
       <version>1.8</version> 
      </dependency> 

Ecco il pezzo completo di codice che sto usando

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

e nel webservice:

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

registrare il provider MultiPartWriter durante la creazione del Client:

ClientConfig cc = new DefaultClientConfig(); 
Client client; 

cc.getClasses().add(MultiPartWriter.class); 
client = Client.create(cc); 

Se si utilizza Maven, queste sono le dipendenze avete bisogno nel vostro 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> 
+0

Questo ha funzionato per me! Si noti che 'client.create (cc);' dovrebbe essere 'Client.create (cc);' per evitare l'avvertimento del compilatore. –

+0

Grazie @ GáborNagy. Ho corretto la maiuscola nella mia risposta. – idontevenseethecode

1

ci sono alcune cose che dovete controllare

aggiungi mimepull.jar al vostro lib o con Maven

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

E se si sta lavorando con file, assicurarsi di inviare nell'intestazione il content-length content-type accept-encoding

0

Ho aggiunto questo in web.xml. Problema risolto.

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param> 
Problemi correlati