Envoyer tableau d'octets et de recevoir de la Chaîne par le biais de services web REST
dans mon Printemps de services web Rest-je envoyer un fichier (même de grande taille) en tant que tableau d'octets, mais lorsque je reçois l'information, l'objet est une Chaîne, donc quand je fais le casting de l'Objet de byte[] j'ai l'erreur suivante:
java.lang.ClassCastException: java.lang.La chaîne ne peut pas être lancé à [B
La originl fichier est converti par
Files.readAllBytes(Paths.get(path))
et ce byte[]
est rempli d'un objet avec un champ result
de type d'Objet.
Lorsque le Client de récupérer cet objet, et elle devient de result
classe avec des acteurs de byte[]
il semble que l'exception ci-dessus, c'est le code du client
Files.write(Paths.get("test.txt"),((byte[])response.getResult()))
;
Si j'utilise une distribution à chaîne, puis d'octets le contenu du fichier est différent du fichier d'origine. Je n'aime pas le type de fichier, le contenu, je n'ai qu'à copier à partir du serveur vers le client répertoire
Comment puis-je faire?Grâce
de la classe de serveur:
@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);
}
}
et le transfert de fichiers est:
public class FileTransfer {
private byte[] content;
private String name;
..get and set
classe client:
@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;
}
- Pouvez-vous montrer comment vous avez défini le point de terminaison rest ou tel? Ce type de contenu est-il accepter? si c'est du json, puis
byte[]
serait envoyé en tant que chaîne encodée en Base64. Le droit mappeur vous pouvez obtenir ce quebyte[]
. - oui, je suis en utilisant json. J'ai mis à jour le code ci-dessus
- Comment est-ce que votre
Response
classe ressembler? Il ne doit pas contenirObject
il devrait être unbyte[]
champ. - il contient de l'objet car la Réponse est utilisé pour tous les web service
- J'avais envisager de modifier la réponse de la classe, si vous n'avez pas réellement la même réponse à tous les temps.
"Q2lhbyBNb25kbw=="
est sinon juste une chaîne de caractères pour la deserializer. Si vous dites qu'il désérialiser par exemple, unBinaryResponse
classe qui a unbyte[]
terrain, il ferait le type de données de conversion de choses pour vous.Response<GenericType>
(pas sûr si cela fonctionne thouhg) ou des sous-classes
Vous devez vous connecter pour publier un commentaire.
De sorte que le client doit être quelque chose comme ceci
Je crois que le type de contenu ici est
text/plain
, par conséquent, le contenu du fichier est un texte en clair. Il suffit de générer le tableau d'octets à partir de la réponse: