Spring MVC - Retorno condicional da função

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

Por que não faz as validações e, caso não haja permissão, retorna o erro, caso contrário, realiza o download?
Se está fazendo a validação no controller, a ausência de permissão poderia lançar uma exceção customizada que ao ser lançada, interromperia o processo, impedindo o download e devolvendo o JSON de erro. Caso a permissão exista, segue com o fluxo normalmente.
Obs. Não uso e não conheço de Spring MVC.

Mas é exatamente isto quero fazer. Veja:

A minha dúvida é: Como devolver, ora um JSON e ora um Arquivo?

Mas é exatamente isto quero fazer. Veja:

A minha dúvida é: Como devolver, ora um JSON e ora um Arquivo?

[/quote]
Bom, eu uso Struts 1 e, quando preciso retornar JSON, eu crio o mesmo e escrevo no response. Então retorno null. Isso quando tenho uma exceção, por exemplo. Quando o processo é normalmente executado, devolvo os arquivos (.xls, .txt, .pdf).

O problema foi resolvido utilizando o response. Fiz assim:

@RequestMapping(value = "/{cliente}/{loja}/notas/{chave}", method = RequestMethod.GET, headers = "Accept=application/json")    
    public @ResponseBody Map<String, ? extends Object> notas(@PathVariable("cliente") String cliente, 
                                                  @PathVariable("loja") String loja, 
                                                  @PathVariable("chave") String chave,
                                                  @RequestParam("saida") String saida,
                                                  @RequestParam("key") String key,
                                                  HttpServletResponse response) {
        try {
            compAuth.authRequest(key, cliente, loja, chave);
            
            //Valida se o formato é pdf ou xml
            if ("xml".equals(saida.toLowerCase()) {
                //Ajusta response para retornar para download
                response.setContentType ("application/xml");
                response.setHeader ("Content-Disposition", "attachment; filename="+ chave +"-nfe.xml");
                
                File fileNFE = new File(CAMINHO_DO_XML);
                InputStream in = new FileInputStream(fileNFE);
                ServletOutputStream outs = response.getOutputStream(); 
                    
                int bit = 256;
                while ((bit) >= 0) {
                bit = in.read();
                if( bit >= 0 ) {
                       outs.write(bit);
                }
                    
                outs.flush();
                outs.close();
                in.close();
                                        
            } else {
                return getModelMapError(Consts.EXCEPT_221, "O formato "+saida+" não é válido.");
            }
            
            
        } catch (FileNotFoundException ex) {
             return getModelMapError(Consts.EXCEPT_222, "O sistema não pode encontrar o arquivo referente à nota "+ chave);            
        } catch (NoAuthorizationException ex) {
            return getModelMapError(Consts.EXCEPT_201, ex.getMessage());
        } catch (IOException ex) {
            Logger.getLogger(DadosVendaController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }