Senden byte-array und String erhalten durch REST web service
in meinem Frühlings-Rest-web-Dienst versende ich eine Datei (auch große Größen) als byte-array, aber wenn ich die Informationen erhalten, das Objekt ist eine Zeichenkette, also wenn ich den cast von Object, byte[] ich erhalte die folgende Fehlermeldung:
java.lang.Classcastexception-Fehler: java.lang.String nicht umgewandelt werden, [B
Dem originl-Datei konvertiert wird durch
Files.readAllBytes(Paths.get(path))
und diese byte[]
gefüllt ist, in einem Objekt mit einem Feld result
des Objekttyps.
Wenn der Client abrufen dieses Objekt und es wird result
Klasse mit cast zu byte[]
es erscheint der oben genannten Ausnahme, das ist der client-code
Files.write(Paths.get("test.txt"),((byte[])response.getResult()))
;
Wenn ich einen cast auf string und dann zu Byte den Inhalt der Datei unterscheidet sich von der ursprünglichen Datei. Ich interessiere mich nicht, die Datei-Typ, Datei-Inhalt, ich habe nur das kopieren vom server zum client-Verzeichnis
Wie kann ich das machen?Dank
server-Klasse:
@Override
@RequestMapping(value = "/", method = RequestMethod.GET)
public @ResponseBody Response getAcquisition(@RequestParam(value="path", defaultValue="/home") String path){
try {
byte[] file = matlabClientServices.getFile(path);
if (file!=null){
FileTransfer fileTransfer= new FileTransfer(file, Paths.get(path).getFileName().toString());
return new Response(true, true, fileTransfer, null);
}
else
return new Response(false, false, "File doesn't exist!", null);
} catch (Exception e) {
ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e);
LOG.error("Threw exception in MatlabClientControllerImpl::getAcquisition :" + errorResponse.getStacktrace());
return new Response(false, false, "Error during file retrieving!", errorResponse);
}
}
- und Bildübertragung ist:
public class FileTransfer {
private byte[] content;
private String name;
..get and set
client-Klasse:
@RequestMapping(value = "/", method = RequestMethod.GET)
public @ResponseBody Response getFile(@RequestParam(value="path", defaultValue="/home") String path){
RestTemplate restTemplate = new RestTemplate();
Response response = restTemplate.getForObject("http://localhost:8086/ATS/client/file/?path={path}", Response.class, path);
if (response.isStatus() && response.isSuccess()){
try {
@SuppressWarnings("unchecked")
LinkedHashMap<String,String> result= (LinkedHashMap<String,String>)response.getResult();
//byte[] parseBase64Binary = DatatypeConverter.parseBase64Binary((String)fileTransfer.getContent());
Files.write(Paths.get(result.get("name")), DatatypeConverter.parseBase64Binary(result.get("content")));
return new Response(true, true, "Your file has been written!", null);
} catch (IOException e) {
return new Response(true, true, "Error writing your file!!", null);
}
}
return response;
}
- Können Sie zeigen, wie Sie definiert die rest-Endpunkt und so? Welchen content-Typ es akzeptieren? wenn es json, dann
byte[]
würde gesendet werden als Base64-codierte Zeichenfolge. Angesichts der Recht mapper können Sie diese alsbyte[]
. - ja, ich bin mit json. Ich aktualisierte den code oben
- Wie sieht Ihr
Response
Klasse Aussehen? Es sollte nicht enthaltenObject
es sollte einbyte[]
Feld. - es enthält Objekt, weil die Antwort für alle web-service
- Ich würde in Erwägung ziehen, die Antwort Klasse, wenn Sie nicht eigentlich die gleiche Antwort die ganze Zeit.
"Q2lhbyBNb25kbw=="
ist sonst nur ein string für den deserializer. Wenn Sie sagen, es zu Deserialisieren z.B. einBinaryResponse
Klasse, die einebyte[]
Feld würde es tun, die Datentyp-Konvertierung Sachen für Sie.Response<GenericType>
(nicht sicher, ob das funktioniert thouhg) oder sub-Klassen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Also der client sollte so etwas wie dieses
Glaube ich, dass der content-type ist hier
text/plain
daher der Inhalt der Datei ist eine nur-text. Generieren Sie einfach byte-array aus der Antwort: