CXF "Kein Message-body-reader gefunden" für byte-array-parameter in POST-service
Bin ich zu schreiben versucht, einen Dienst, der verantwortlich für das hochladen einer Datei, indem Sie die Datei als array von bytes in den POST Einheit. Hier ist mein code
Meine CXF Service
@Path("MyTest")
public class TestService {
@POST
public String MyPost(Byte[] bytes){
System.out.println("Service invoked");
return "Hello, I am a POST response";
}
}
Mein Client
File image = new File("C:\\snake.jpg");
FileInputStream is = new FileInputStream(image);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] fileInBytes = bos.toByteArray();
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:8080/MyApp");
target = target.path("MyTest");
Response response = target.request().post(Entity.entity(fileInBytes, MediaType.APPLICATION_OCTET_STREAM));
InputStream i = (InputStream) response.getEntity();
BufferedReader br = new BufferedReader(new InputStreamReader(i));
System.out.println(br.readLine());
- Und dies ist die Fehler, dass ich
SEVERE: No message body reader has been found for class [Ljava.lang.Byte;, ContentType: application/octet-stream
Nov 06, 2014 4:02:50 PM org.apache.cxf.jaxrs.impl.WebApplicationExceptionMapper toResponse
WARNING: javax.ws.rs.WebApplicationException: HTTP 415 Unsupported Media Type
at org.apache.cxf.jaxrs.utils.JAXRSUtils.readFromMessageBody(JAXRSUtils.java:1298)
...
Irgendwelche Ideen darüber? Gibt es einen besseren Weg, um eine Datei-Upload-service?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie
InputStream
Abgesehen, in Ihrem client-code, haben Sie nicht wirklich etwas geschrieben, um den Ausgabe-stream. Es sollte etwas sein, das mehr wie
UPDATE
Du kann tatsächlich verwenden ein byte-array. Sie brauchen nur zu verwenden die primitiven
byte[]
Es auch sogar möglich
File
JAX-RS erstellt eine temporäre Datei für die Eingabe auf der Festplatte. Es liest aus dem Netzwerk-Puffer und speichert die gelesenen bytes in diese temporäre Datei.
Alle funktionieren. Wählen Sie Ihr Gift
Hatte genau das gleiche problem. Hinzufügen von application/octet-stream als parameter der @Consumes-annotation das problem gelöst:
Jedoch, wenn Sie sicherstellen können, dass der Aufrufer legt die entsprechenden Content-Type im HTTP-request-header, ist es möglicherweise nicht notwendig, fügen Sie "application/octet-stream" der @Consumes-annotation.
Ein Beispiel mit CURL:
curl -vX-POST -H "Content-Type:text/xml" -T "postdata.xml" "http://localhost:9000/ws/rest/..."