Próbuję wstrzyknąć komponent bean zdefiniowany w kontekście Spring do komponentu zarządzanego przez CDI, ale nie udaje mi się. Ziarno nie jest wstrzykiwane, zamiast tego tworzone jest nowe wystąpienie za każdym razem, gdy należy wykonać iniekcję. Moje środowisko to Tomcat 7 z JBoss Weld.Wstrzyknięcie fasoli Spring za pomocą CDI @ Inject
The Spring ApplicationContext jest straighforward:
<beans>
...
<bean id="testFromSpring" class="test.Test" />
...
</bean>
CDI udało fasola wygląda następująco:
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
private Test myTest = null;
...
public Test getTest() {
return this.myTest;
}
}
To jest mój 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>
Jednak, kiedy dostęp do test
właściwość ze strony JSF, nowaInstancjajest tworzona za każdym razem, gdy pojawia się dostęp. To jest prosty przykład:
<html>
...
<p>1: <h:outputText value="#{testFromSpring}" /></p>
<p>2: <h:outputText value="#{testA.test}" /></p>
...
uzyskać następujące dane wyjściowe:
1: [email protected]
2: [email protected]
Po odświeżeniu:
1: [email protected]
2: [email protected]
widzę, że pierwsze wyjście jest prawidłowe. Bez względu na częstotliwość odświeżania strony, testFromSpring
zwraca wartość z komponentu bean zdefiniowanego w kontekście Spring. Jednak drugie wyjście wyraźnie pokazuje, że za każdym razem, gdy wywoływana jest metoda getTest
na komponentach test
, tworzona jest nowa instancja Test
i wstrzykiwana zamiast użycia instancji z kontekstu Spring, jak można się spodziewać.
Jaki jest powód takiego zachowania?
Jak wstrzyknąć fasolę z kontekstu sprężyny do komponentu zarządzanego przez komponent CDI?
Próbowałem też za pomocą kwalifikatora przy użyciu nazwy zdefiniowanej w kontekście wiosennej, ale teraz jest wyjątek wskazuje, że fasola nie można znaleźć:
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Injection point has unsatisfied dependencies. Injection point: field test.TestA.myTest; Qualifiers: [@javax.inject.Named(value=testFromSpring)]
kodu
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
@javax.inject.Named("testFromSpring")
private Test myTest = null;
To może być brak kawy tutaj, ale po co wstrzykiwać prywatnego członka twojej klasy (która jest już ustawiona na zero). Czy nie byłoby prostsze udostępnienie testu myTest jako części konstruktora TestA (np. Iniektora Constructor)? –
Zastrzyk jest tylko przykładem, a nie punktem pytania. – perdian