Bom dia, estou com uma dúvida e confesso que não consigo avançar. Eu tenho uma aplicação Spring MVC a qual tem um Controller que é responsável por retornar um arquivo XML (referente à uma NF-e) para download. O problema que estou passando é que em todos os controller’s eu tenho algumas validações que retornam um MAP no formato JSON. Por exemplo, verifico se a requisição é válida e se a aplicação cliente está apta a requisitar informações do servidor, se falhar neste teste de autenticidade, retorno um JSON com a mensagem de erro.
Só que no caso do download, eu tenho que devolver o arquivo solicitado ou o JSON de erro de a requisição não for autorizada ou se o arquivo não for encontrado. Tenho meu controller assim:
@RequestMapping(value = "/{cliente}/{loja}/notas/", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody Map<String, ? extends Object> notas(@PathVariable("cliente") String cliente,
@PathVariable("loja") String loja,
@RequestParam("key") String key) {
try {
compAuth.authRequest(key, cliente, loja, null);
List<DadosVendaVO> dados = service.getUltimasVenda(cliente, loja, 1, 25);
return getMapByInterval(dados, count, 1);
} catch (NoAuthorizationException ex) {
return getModelMapError(Consts.EXCEPT_201, ex.getMessage());
} catch (HibernateException ex) {
return getModelMapError(Consts.EXCEPT_211, ex.getMessage());
} catch (Exception ex) {
return getModelMapError(Consts.EXCEPT_299, ex.getMessage());
}
}
A função getMapByInterval:
protected Map<String, Object> getMapByInterval(List<T> lista, Integer page) {
Map<String, Object> modelMap = new HashMap<String, Object>(5);
modelMap.put("page", page);
modelMap.put("recperpage", lista.size());
modelMap.put("data", lista);
modelMap.put("success", true);
return modelMap;
}
Estes métodos acima ainda não são o responsável pelo download… É apenas para ver como estou devolvendo meu arquivo. Agora pensei em fazer algo assim:
@RequestMapping(value = "/{cliente}/{loja}/notas/{chave}", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody NAO_SEI_O_QUE_POR_AQUI download(@PathVariable("cliente") String cliente,
@PathVariable("loja") String loja,
@PathVariable("chave") String chave,
@RequestParam("saida") String saida,
@RequestParam("key") String key) {
try {
compAuth.authRequest(key, cliente, loja, chave);
//Valida se o formato é pdf ou xml
if ((!"pdf".equals(saida.toLowerCase()))||(!"xml".equals(saida.toLowerCase()))) {
return getModelMapError(Consts.EXCEPT_221, "O formato "+saida+" não é válido.");
}
//Aqui deveria ter meu algoritmo para pegar o arquivo solicitado
...
if (DEU_CERTO) {
//Retorno o arquivo
???????
}
} catch (NoAuthorizationException ex) {
return getModelMapError(Consts.EXCEPT_201, ex.getMessage());
}
}
Eu até pensei em usar algo parecido com isto:
@RequestMapping(value = "/{cliente}/{loja}/notas/{chave}", method = RequestMethod.GET, headers = "Accept=application/json")
public @ResponseBody NAO_SEI_O_QUE_POR_AQUI download(@PathVariable("cliente") String cliente,
@PathVariable("loja") String loja,
@PathVariable("chave") String chave,
@RequestParam("saida") String saida,
@RequestParam("key") String key) throws IOException {
byte[] documentBody = this.pdfFramework.createPdf(chave);
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "pdf"));
header.set("Content-Disposition",
"attachment; filename=" + chave +".pdf");
header.setContentLength(documentBody.length);
return new HttpEntity<byte[]>(documentBody, header);
}
Neste ultimo exemplo acho que resolverei o problema do download, mas não resolveria o problema das minha validações…
Se alguém puder me ajudar, ficarei grato.
[]s