2017-02-03 1 views
0

J'ai une intégration configurée avec Spring en utilisant Apache Axis en tant que client SOAP.Demandes et réponses de client Axis Log avec le bean Spring

Je suis en mesure de configurer le client-config.wsdd pour configurer un gestionnaire en tant que classe qui est en dehors du contexte de printemps. Ce que je voudrais faire est de configurer le gestionnaire de sorte qu'il soit dans le contexte du printemps. Est-ce possible?

Voici ma position actuelle 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> 

J'ai aussi le service enregistré avec le printemps:

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

Répondre

0

Je cherchais un moyen d'utiliser bean Spring directement en tant que gestionnaire pour le client Axis et exactement à des fins de journalisation des détails de demande/réponse.

Il semble qu'il n'existe actuellement aucune façon simple et directe de le faire.

Il existe cependant un moyen de le faire en accédant à un bean Spring à partir du gestionnaire Axis via le contexte racine de l'application. Il y a quelques problèmes ici:

  • gestionnaires d'axe sont instanciées quand ils sont nécessaires en tant que classes simples (pas de haricots)

  • instances de gestionnaire ne peut pas compter sur l'existence d'une servlet (ou, c.-à-faces) contexte au moment de leur méthode invoke() est appelée

en raison de cela, vous devez placer votre grain de printemps dans le contexte de l'application racine. Le problème est que vous ne pouvez pas accéder au contexte de l'application de la manière habituelle (c'est-à-dire via ServletContext de FacesContext). Contournement pour cela est de créer votre propre bean ApplicationContextAware qui va stocker la référence au contexte de l'application racine au démarrage de l'application pour que vous puissiez l'utiliser dans le gestionnaire Axis.

exemple de mise en œuvre minimale ApplicationContextAware de haricot:

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

et application-context.xml déclarer la fève:

<bean id="appContextProvider" lazy-init="false" class="package.where.the.class.is.ApplicationContextProvider" /> 

Notez la lazy-init="false" dans la déclaration, ce qui est important . Puisque ce bean n'est référencé (ou auto-câblé) nulle part, Spring n'en créera jamais l'instance, car Spring utilise une stratégie paresseuse pour la création de beans. La définition de lazy-init sur false garantit que le bean est créé au démarrage de l'application.

Pourvu que vous avez votre grain de l'exploitation forestière de DB (mis en œuvre par DBLogBean classe) correctement mis en place et chargé/créé par Spring, vous pouvez y accéder dans le gestionnaire Axe-à-dire comme ceci:

ApplicationContext ctx = ApplicationContextProvider.getApplicationContext(); 
if (ctx != null) { 
    DBLogBean bean = (DBLogBean) ctx.getBean("yourDBLogBeanId"); 
    if(bean != null) { 
     bean.doLogOrSomething(); 
    } 
} 

Assurez-vous Vérifiez si ApplicationContextProvider.getApplicationContext() renvoie null ou non avant d'extraire le bean DB du contexte. Notez maintenant vous devez également vérifier si ctx.getBean() renvoie null ou pas.

Si ce n'est pas une option (par exemple pour une raison quelconque, vous devez avoir la fève DB chaque fois que gestionnaire est appelé axe), alors vous devez vous assurer que gestionnaire Axis est jamais appelée aprèsApplicationContextProvider haricot a été créé. Ce sujet, cependant, est hors de portée ici;)

REMARQUE: Création d'haricots à l'aide lazy-init="false" est pas une manière préférée de créer des instances de haricots. Les haricots doivent être auto-câblés/référencés par d'autres haricots/code et laissés au printemps pour gérer leur cycle de vie. Par exemple, un inconvénient de la création de bean forçant au démarrage est que vous ne pouvez pas être sûr à quel moment ils ont été créés et deviennent disponibles, sauf si vous prenez des mesures supplémentaires pour gérer cela (ou assurez-vous qu'ils sont référencés par un autre code mais alors, pourquoi utiliser lazy-init="false" en premier lieu?).