Wie kann ich Methodenausdrücke von JSF-Ajax-Anforderungen protokollieren?

8

Ich habe herausgefunden, wie man loggt, wenn eine Anfrage eine Ajax-Anfrage ist und aus welcher Seite sie stammt, in einem Filter.

Was ich wirklich gerne machen würde, ist zu protokollieren, wofür die Ajax-Anfrage eigentlich ist. So wie der Name der Methode, die vom Ajax aufgerufen wird (zB "findAddress" in diesem Aufruf: <p:ajax process="contactDetails" update="@form" listener="#{aboutYouController.findAddress}" .... )

Wie kann ich das tun? Meine App hat viele Ajax-Anfragen und ich möchte protokollieren, welche ausgelöst werden.

%Vor%     
Mark W 06.08.2015, 10:20
quelle

1 Antwort

10
  

Was ich wirklich gerne machen würde, ist, wofür die Ajax-Anfrage eigentlich ist. So wie der Name der Methode, die vom Ajax aufgerufen wird (zB "findAddress" in diesem Aufruf: <p:ajax process="contactDetails" update="@form" listener="#{aboutYouController.findAddress}" .... )

Diese Information ist nur in der JSF-Komponentenstruktur verfügbar. Die JSF-Komponentenstruktur ist nur nach der Build-Zeit verfügbar. Eine Sicht wird nur erstellt, wenn die Anforderung von FacesServlet geliefert wurde. Daher ist ein Servlet-Filter viel zu früh, bevor er vor einem Servlet ausgeführt wird.

Sie sollten den Code nach der Wiederherstellungsansichtsphase eines Postbacks ausführen. Der JSF-Komponentenbaum ist in diesem Moment garantiert verfügbar. Sie können FacesContext#isPostback() verwenden, um zu prüfen, ob aktuelle Anfrage ist ein Postback. Sie können PartialViewContext#isAjaxRequest() verwenden, um zu prüfen, ob Aktuelle Anfrage ist eine Ajax-Anfrage. Sie können den vordefinierten Parameter javax.faces.source request verwenden, um die Client-ID der Quellkomponente der Ajax-Anforderung abzurufen. Sie können den vordefinierten Parameter javax.faces.behavior.event request verwenden, um den Ajax-Ereignisnamen zu erhalten (z. B. change , click , action usw.).

Das Erlangen der zugehörigen Listener ist wiederum eine Geschichte. Dies ist für ActionSource2 -Komponenten (zB <h|p:commandButton action="#{...}"> ) einfach. da die MethodExpression nur von ActionSource2#getActionExpression() . Dies ist jedoch für BehaviorBase -Taghandler nicht einfach (zB <f|p:ajax listener="#{...}"> ) da diese API keine Methode wie getBehaviorListeners() hat. Es gibt nur Methoden zum Hinzufügen und Entfernen von ihnen, aber nicht zum Abrufen einer Liste von ihnen. Es ist also eine scheußliche Reflektionstrickerei erforderlich, um auf das private -Feld mit den Listenern zuzugreifen, deren Name JSF-spezifisch ist. In Mojarra ist es listeners und in MyFaces ist es _behaviorListeners . Beide sind glücklicherweise zuweisbar von List und es ist das einzige Feld dieses Typs, also könnten wir einfach nachsehen. Sobald Sie die BehaviorListener Instanz zur Hand haben, dann immer noch müssen noch eine weitere Reflexion durchführen, um das MethodExpression -Feld dieser Instanz zu erhalten. Yuck.

Alles in allem sieht die Trickserei wie folgt aus: PhaseListener hört auf afterPhase von RESTORE_VIEW :

%Vor%

Um es zum Laufen zu bringen, registrieren Sie sich wie folgt in faces-config.xml :

%Vor%

Oben ist getestet und kompatibel mit Mojarra und PrimeFaces und theoretisch auch kompatibel mit MyFaces.

Aktualisieren : Falls Sie die JSF-Dienstprogrammbibliothek OmniFaces verwenden oder seit Version 2.4 für Sie offen sind kann die neue Components#getCurrentActionSource() Hilfsmethode verwenden, um das herauszufinden die aktuelle Aktionsquellenkomponente und Components#getActionExpressionsAndListeners() , um eine Liste aller Aktionsmethoden und Listener zu erhalten, die für eine bestimmte Komponente registriert sind. Dies ist auch bei regulären (Nicht-Ajax-) Anfragen verwendbar. Damit kann das obige PhaseListener -Beispiel wie folgt reduziert werden:

%Vor%     
BalusC 10.11.2015, 20:14
quelle

Tags und Links