Domanda

Per eseguire il debug di richieste in errore, vorrei stampare tutte le informazioni provenienti da HttpServletRequest.

Ora, è possibile che una richiesta fallisca parzialmente(ad es.Diverse corrispondenze hanno successo, eppure una ha fallito) nel qual caso vorrei catturare l'eccezione nel metodo interno che non è riuscito, stampare l'errore + il ServletUtil.toStringHttpServletRequest () e continuare a fornire il servizio (degradato ma ancora utile vs.errore completo della richiesta).

La nostra attuale implementazione cattura l'eccezione e stampa informazioni stupide ("getRules failed") o lancia l'eccezione fino a doGet() (annullando efficacemente il servizio per l'utente) dove, come in doGet (), ho accesso a HttpServletRequest dove posso stampare le informazioni di debug pertinenti (intestazioni, parametri...).

Passare HttpServletRequest a ogni funzione chiamata durante la richiesta che potrebbe fallire sembra un po ' brutto, lo farò se non verrà visualizzata nessun'altra soluzione elegante.

Fare un ServletUtil prima testa.toStringHttpServletRequest () e memorizzarlo in una mappa ThreadLocal sarebbe uno spreco sia in memoria che in tempo di CPU.Per qualche ragione sembra sbagliato memorizzare l'oggetto HttpServletRequest in ThreadLocal (si prega di correggere se ho torto).

Le informazioni di debug vengono scritte sia nel registro della macchina locale che vengono inviate via email direttamente agli sviluppatori (Ottimo lavoro log4j TLSSMTPAppender), quindi l'accesso in più posti non sarà pratico (sarà necessario assemblare diverse e-mail per capire cosa sta succedendo) e ssh'ing nel server è vecchiaia:) (Siamo tutti nuvolosi qui...il server potrebbe non esistere nel momento in cui riesco a guardare l'errore)

Quindi, la mia soluzione sta ottenendo l'accesso a una " PrintErrorUtility "(TODO:meglio chiamarlo).Che riceverà (String errorMsg, Throwable t, HttpServletRequest) che stamperà l'errore insieme tutte le informazioni rilevanti...Questo verrà chiamato dai blocchi try {} catch interni che notificheranno l'errore ma non annulleranno la richiesta a causa di esso.

Ovviamente sto prendendo i server in esecuzione in produzione.

Commenti?Si prega di avvisare.

Grazie, Maxim.

È stato utile?

Soluzione

Eseguire questo compito in un Filter dopo il FilterChain#doFilter() chiamare.Il ServletRequest l'oggetto è già lì.Nel codice aziendale in cui questa eccezione deve essere soppressa con grazia, archiviare l'eccezione come attributo di richiesta e lasciare che Filter controllare / afferrare dalla richiesta.


Aggiornare:come per i commenti, ecco un esempio:

public class Context { 
    private static ThreadLocal<Context> instance = new ThreadLocal<Context>();
    private HttpServletRequest request;
    private List<Exception> exceptions = new ArrayList<Exception>();

    private Context(HttpServletRequest request) {
        this.request = request;
        this.request.setAttribute("exceptions", exceptions);
    }

    public static Context getCurrentInstance() {
        return instance.get();
    }

    public static Context newInstance(HttpServletRequest request) {
        Context context = new Context(request);
        instance.set(context);
        return context;
    }

    public void release() {
        instance.remove();
    }

    public void addException(Exception exception) {
        exceptions.add(exception);
    }
}

Ed ecco come usarlo nel servlet del controller:

Context context = Context.newInstance(request);
try {
    executeBusinessCode();
} finally {
    context.release();
}

Ed ecco come potresti usarlo nel codice aziendale eseguito:

} catch (Exception e) {
    Context.getCurrentInstance().addException(e);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top