Frage

Um fehlgeschlagene Anfragen zu debuggen, möchte ich alle Informationen von HttpServletRequest drucken.

Jetzt ist es möglich, dass eine Anfrage teilweise fehlschlägt (zum Beispiel.In diesem Fall möchte ich die Ausnahme in der fehlgeschlagenen internen Methode abfangen, den Fehler + das ServletUtil drucken.toStringHttpServletRequest () und weiterhin Dienste bereitstellen (verschlechtert, aber immer noch nützlich vs.vollständiger Anforderungsfehler).

Unsere aktuelle Implementierung fängt entweder die Ausnahme ab und druckt dumme Informationen ("getRules failed") oder löst die Ausnahme bis doGet () aus (beendet effektiv den Dienst für den Benutzer), wo ich wie in doGet () Zugriff auf HttpServletRequest habe, wo ich drucken kann bei den relevanten Debug-Informationen (Header, Parameter...).

Das Übergeben von HttpServletRequest an jede Funktion, die während der Anforderung aufgerufen wird und möglicherweise fehlschlägt, scheint etwas hässlich zu sein. Ich werde es tun, wenn keine andere elegante Lösung auftaucht.

Vor dem Kopf ein ServletUtil erstellen.toStringHttpServletRequest() und das Speichern in einer ThreadLocal Map wäre sowohl im Speicher als auch in der CPU-Zeit verschwenderisch.Aus irgendeinem Grund fühlt es sich falsch an, das HttpServletRequest-Objekt in ThreadLocal zu speichern (bitte korrigieren Sie, wenn ich falsch liege).

Debug-Informationen werden sowohl in das lokale Computerprotokoll geschrieben als auch direkt per E-Mail an Entwickler gesendet (großartige Arbeit log4j TLSSMTPAPIERHALTER), Daher ist das Anmelden an mehreren Stellen nicht praktikabel (Es müssen mehrere E-Mails zusammengestellt werden, um zu verstehen, was los ist) und das SSH-Ing auf dem Server ist alt :) (Wir sind hier alle bewölkt...der Server existiert möglicherweise nicht, wenn ich den Fehler sehe.)

Meine Lösung erhält also Zugriff auf eine "PrintErrorUtility" (TODO:nennen Sie es besser).Das wird empfangen (String errorMsg, Throwable t, HttpServletRequest), das den Fehler zusammen mit allen relevanten Informationen ausgibt...Dies wird von internen try {} catch-Blöcken aufgerufen, die über den Fehler informieren, die Anforderung jedoch nicht abbrechen.

Offensichtlich beschäftige ich mich mit Servern, die in der Produktion laufen.

Kommentare?Bitte beraten.

Danke, Maxim.

War es hilfreich?

Lösung

Erledigen Sie diese Aufgabe in einem Filter nach der FilterChain#doFilter() nennen.Der ServletRequest objekt ist schon da.Speichern Sie im Geschäftscode, in dem diese Ausnahme ordnungsgemäß unterdrückt werden soll, die Ausnahme als Anforderungsattribut und lassen Sie einfach die Filter überprüfen / greifen Sie es aus der Anfrage.


Update:gemäß den Kommentaren ist hier ein Beispiel:

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);
    }
}

Und so verwenden Sie es in Ihrem Controller-Servlet:

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

Und so könnten Sie es im ausgeführten Geschäftscode verwenden:

} catch (Exception e) {
    Context.getCurrentInstance().addException(e);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top