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