ich nach einem Weg suchen, Spring-Bean zu verwenden, um direkt als Handler für Axis-Client und genau für die Zwecke der Protokollierung von Anfrage/Antwort-Details.
Es scheint, dass es derzeit keinen einfachen und direkten Weg gibt, dies zu tun.
Es gibt jedoch eine Möglichkeit, dies zu tun, indem Sie über den Anwendungsstammkontext auf eine Spring-Bean vom Axis-Handler zugreifen. Es gibt nur wenige Themen hier:
Achsen Handler instanziiert werden, wenn sie als einfache Klassen benötigt werden (nicht Bohnen)
Handler Instanzen nicht auf Existenz eines Servlet verlassen können (oder, dh Faces) Kontext zu der Zeit ihre invoke()
Methode
aus diesem Grunde genannt wird, haben Sie Ihren Spring-Bean in der Wurzel Anwendungskontext zu stellen. Problem ist, dass Sie nicht auf den Anwendungskontext in der üblichen Weise (d. H. Über ServletContext
von FacesContext
) zugreifen können. Umgehung dafür ist, Ihre eigene ApplicationContextAware
Bean zu erstellen, die den Verweis auf den Stammanwendungskontext beim App-Start speichert, damit Sie ihn im Axis-Handler verwenden können.
Minimal ApplicationContextAware
Bean Implementierungsbeispiel:
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext rootAppContext;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
rootAppContext = ctx;
}
public static ApplicationContext getApplicationContext() {
return rootAppContext;
}
}
und in application-context.xml
erklären die Bohne:
<bean id="appContextProvider" lazy-init="false" class="package.where.the.class.is.ApplicationContextProvider" />
Beachten Sie die lazy-init="false"
in Erklärung, diese wichtige ist. Da diese Bean nirgendwo referenziert (oder automatisch verdrahtet) wird, wird Spring die Instanz niemals erstellen, da Spring eine faule Strategie für die Bean-Erstellung verwendet. Wenn Sie lazy-init
auf false setzen, wird sichergestellt, dass die Bean beim Start der Anwendung erstellt wird.
Sofern Sie Ihre DB-Protokollierung Bohne (von DBLogBean
Klasse implementiert) haben richtig eingerichtet und geladen/von Spring erstellt, können Sie es in den Axis-Handler wie folgt also zugreifen:
ApplicationContext ctx = ApplicationContextProvider.getApplicationContext();
if (ctx != null) {
DBLogBean bean = (DBLogBean) ctx.getBean("yourDBLogBeanId");
if(bean != null) {
bean.doLogOrSomething();
}
}
sicher, dass Sie Make Überprüfen Sie, ob ApplicationContextProvider.getApplicationContext()
null
zurückgibt oder nicht, bevor DB Bean aus dem Kontext abgerufen wird. Hinweis: Jetzt müssen Sie auch prüfen, ob ctx.getBean()
null
zurückgibt oder nicht.
Wenn dies nicht möglich ist (das heißt aus irgendeinem Grund die DB Bohne haben müssen, wenn Achsen-Handler genannt wird), dann haben Sie sicher Achsen Handler machen nur genannt wird, immer nachApplicationContextProvider
Bean erstellt wurde. Das Thema ist jedoch hier nicht im Anwendungsbereich;)
HINWEIS: Bohnen Erstellen von lazy-init="false"
verwenden, ist nicht eine bevorzugte Art und Weise Bean-Instanzen zu schaffen. Bohnen sollten sein, die durch andere Bohnen/den Code automatisch verdrahtet werden/referenziert werden und zu Frühling gelassen werden, um ihren Lebenszyklus zu handhaben. Ein Nachteil beim Erzwingen der Bean-Erschaffung beim Start ist, dass Sie nicht sicher sein können, an welchem Punkt sie erstellt und verfügbar werden, außer Sie zusätzliche Schritte ergreifen, um das zu behandeln (oder stellen Sie sicher, dass sie von anderem Code referenziert werden) aber warum dann lazy-init="false"
an erster Stelle?).