2017-02-03 3 views
0

Ich habe eine Integration mit Spring mit Apache Axis als SOAP-Client eingerichtet.Log Axis Client Anfragen und Antworten mit Spring Bean

Ich bin in der Lage, die client-config.wsdd zu konfigurieren, einen Handler als eine Klasse, die außerhalb der Spring-Kontext ist zu konfigurieren. Ich möchte den Handler so konfigurieren, dass er sich im Spring-Kontext befindet. Ist das möglich?

Hier ist mein aktuelle client-config.wsdd

<?xml version="1.0" encoding="UTF-8"?> 
<deployment name="defaultClientConfig" 
      xmlns="http://xml.apache.org/axis/wsdd/" 
      xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 

    <handler name="log" type="java:xxx.xxx.handler.SOAPLogHandler"> 
    </handler> 

    <globalConfiguration> 
     <parameter name="disablePrettyXML" value="false"/> 
     <requestFlow> 
      <handler type="log"/> 
     </requestFlow> 
     <responseFlow> 
      <handler type="log"/> 
     </responseFlow> 
    </globalConfiguration> 

    <transport name="http" pivot="java:org.apache.axis.transport.http.HTTPSender"/> 
</deployment> 

Ich habe auch den Service mit Feder registriert:

<bean id="wsYPSoap" class="xxx.xxx.core.ws.WsYPSoapProxy"> 
    <constructor-arg value="${xxx.service.url}" /> 
</bean> 

Antwort

0

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?).

Verwandte Themen