How to display the exception message (ex.getMessage ()) thrown by the server in a jquery ajax?

8
@GET
@Path("boleto/{processo}/{resposta}")
@Produces({ "application/pdf","application/json"})
public Response gerarBoletoDividaAtivaComCaptcha(@PathParam("processo") String numeroProcesso,@PathParam("resposta") String resposta ) throws DetranException {
    if(SimpleCaptcha.validar(request, resposta, true)) {
        try {
            if(true){
                throw new Exception("Erro forcado!");
            }
            StreamingOutput output = geraBoletoPdf();
            return (Response.ok(output).header("content-disposition", "attachment; filename = boleto").build());
        } catch(Exception ex) {
            EDividaAtiva divida = new EDividaAtiva();
            divida.setSucesso(sucesso);
            divida.setMsg(ex.getMessage());
            return (Response.ok(divida).build());
        }

    }else{
        return null;
    }
}




     $.ajax({
                type : 'GET',
                url : URL_APP_CONSULTA_DIVIDA_ATIVA + url,

                statusCode : {
                    //
                    // 500 - Internal Server Error
                    //
                    500 : function(data) {
                        alert('500 - Internal Server Error');
                    },

                    //
                    // 204 - No Content
                    //
                    // Captcha incorreto.
                    //
                    204 : function() {
                        showSimpleCaptcha();
                        showMsg('Captcha incorreto. Tente novamente.');
                    },

                    //
                    // 404 - Page not found
                    //
                    // Serviço indisponivel
                    //
                    404 : function() {
                        showSimpleCaptcha();
                        showMsg('Serviço indisponível no momento. Tenta novamente a alguns minutos.');
                    },

                    // 405 - Method not allowed
                    // Tratamento especifico para servico indisponivel
                    405 : function() {
                        window.location = "Manutencao.html";
                    }
                },

                success : function(dados) {

                    //
                    // Exibe a interface resposta.
                    //
                    createResponseInterface(dados,processo);
                    return;
                }
            });
    
asked by anonymous 14.02.2014 / 11:25

3 answers

5

Soon after Sucess add.

 error: function (xhr, ajaxOptions, thrownError) {
                    var mensagemErro = retornaMensagemErro(xhr);
                    alert(mensagemErro);
                }

It will stay like this

success : function(dados) {

                    //
                    // Exibe a interface resposta.
                    //
                    createResponseInterface(dados,processo);
                    return;
                },
error: function (xhr, ajaxOptions, thrownError) {
                        var mensagemErro = retornaMensagemErro(xhr);
                        alert(mensagemErro);
                    }

Also add this function to your code

function retornaMensagemErro(xhr) {
    var msg = JSON.parse(xhr.responseText);
    return msg.ExceptionMessage;
}
    
14.02.2014 / 11:53
2

To display the exception message, I suggest changing the status code to 500 and capturing the msg property of the data variable in jQuery. Also, I believe your method should not throw the DetranException exception. It is better to catch the exception and treat it correctly.

In Java:

@GET
@Path("boleto/{processo}/{resposta}")
@Produces({ "application/pdf","application/json"})
public Response gerarBoletoDividaAtivaComCaptcha(@PathParam("processo") String numeroProcesso,@PathParam("resposta") String resposta ) throws DetranException {
    if(SimpleCaptcha.validar(request, resposta, true)) {
        try {
            if(true){
                // ??
                throw new Exception("Erro forcado!");
            }
            StreamingOutput output = geraBoletoPdf();
            return (Response.ok(output).header("content-disposition", "attachment; filename = boleto").build());
        } catch(Exception ex) {
            // DetranException está sendo capturada aqui,
            // então acredito que você não precisa declarar na assinatura do método
            EDividaAtiva divida = new EDividaAtiva();
            divida.setSucesso(sucesso);
            divida.setMsg(ex.getMessage());

            return Response.serverError().entity(divida).build();
        }

    } else {
        return null;
    }
}

And no javascript:

$.ajax({
    type : 'GET',
    url : URL_APP_CONSULTA_DIVIDA_ATIVA + url,

    statusCode : {
        //
        // 500 - Internal Server Error
        //
        500 : function(data) {
            alert(data.msg);
        },

        // ...
});
    
14.02.2014 / 11:57
2

In addition to the answer given by friend Paul has another solution that maybe few people know about - you can rewrite the global $ .ajax, $ .get, $ .post method using $ .ajaxSetup:

$.ajaxSetup({
        cache: true,
        localCache: false,
        cacheTTL: 8760, // 1 ano
        error: function(e, x, settings, exception) {
            console.log(e, 'e');
            console.log(x, 'x');
            console.log(settings, 'settings');
            console.log(exception, 'exception');
            if (e.statusText !== "abort") {
                var message;
                var statusErrorMap = {
                    '400': "O servidor recebeu sua requisição, mas o conteúdo da resposta é inválido.",
                    '401': "Acesso negado.",
                    '403': "Recurso proibido - não pode ser acesso",
                    '404': "Conteúdo não encontrado",
                    '405': "Requisição de troca de domínio não permitido",
                    '500': "Erro interno do servidor.",
                    '503': "Serviço indisponível"
                };
                if (e.status) {
                    message = statusErrorMap[e.status];
                    if (!message) {
                        message = "Erro desconhecido - Cod: " + e.status;
                    }
                } else if (exception === 'parsererror') {
                    message = "Erro. Falha na solicitação de análise JSON.";
                } else if (exception === 'timeout') {
                    message = "Tempo limite esgotado.";
                } else if (exception === 'abort') {
                    message = "Requisição aborteda pelo servidor";
                } else {
                    message = "Erro desconhecido.";
                }
                notify('error', 'Falha de comunicação', message);
            }
        }
    });
    
14.02.2014 / 12:00