J'essaie d'injecter un bean défini dans un contexte Spring dans un composant géré par CDI, mais je ne réussis pas. Le bean n'est pas injecté, une nouvelle instance est créée à chaque fois que l'injection doit être effectuée. Mon environnement est Tomcat 7 avec JBoss Weld.Injection d'un bean Spring à l'aide de CDI @Inject
Le printemps ApplicationContext est straighforward:
<beans>
...
<bean id="testFromSpring" class="test.Test" />
...
</bean>
Le CDI a réussi ressemble haricot ceci:
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
private Test myTest = null;
...
public Test getTest() {
return this.myTest;
}
}
Ceci est mon faces-config.xml
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">
<application>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>
</faces-config>
Cependant, quand j'accéder à la test
propriété à partir d'une page JSF, un nouveau Test
L'instance est créée chaque fois que l'accès se produit. Ceci est un exemple simple:
<html>
...
<p>1: <h:outputText value="#{testFromSpring}" /></p>
<p>2: <h:outputText value="#{testA.test}" /></p>
...
Je reçois la sortie suivante:
1: [email protected]
2: [email protected]
Après un rafraichissement
1: [email protected]
2: [email protected]
Je vois que la première sortie est correcte. Peu importe la fréquence d'actualisation de la page, la valeur testFromSpring
renvoie la valeur du bean défini dans le contexte Spring. Cependant, la deuxième sortie montre clairement qu'à chaque fois que la méthode getTest
sur les composants test
est invoquée, une nouvelle instance Test
est créée et injectée au lieu d'utiliser l'instance du contexte Spring comme je m'y attendais.
Alors, quelle est la raison de ce comportement?
Comment puis-je injecter le bean à partir du contexte Spring dans le bean géré par CDI?
J'ai aussi essayé d'utiliser un qualificatif en utilisant le nom défini dans le contexte du printemps, mais maintenant une exception est levée indiquant que le haricot ne peut pas être trouvé:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Injection point has unsatisfied dependencies. Injection point: field test.TestA.myTest; Qualifiers: [@javax.inject.Named(value=testFromSpring)]
pour le code
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
@javax.inject.Named("testFromSpring")
private Test myTest = null;
Cela pourrait être un manque de café ici, mais pourquoi injecter un membre privé de votre classe (qui est déjà mis à null). Ne serait-il pas plus simple de fournir myTest dans le cadre du constructeur de TestA (par exemple, l'injection du constructeur) –
L'injection est juste un exemple et non le point de la question. – perdian