Spring コンテキストで定義された Bean を CDI 管理コンポーネントに注入しようとしていますが、うまくいきません。Bean は注入されません。代わりに、注入が実行されるたびに新しいインスタンスが作成されます。私の環境は、JBoss Weld を使用した Tomcat 7 です。
Spring ApplicationContext は簡単です。
<beans>
...
<bean id="testFromSpring" class="test.Test" />
...
</bean>
CDI マネージド Bean は次のようになります。
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
private Test myTest = null;
...
public Test getTest() {
return this.myTest;
}
}
これは私の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>
ただし、test
JSF ページ内からプロパティにアクセスTest
すると、アクセスが発生するたびに新しいインスタンスが作成されます。これは簡単な例です:
<html>
...
<p>1: <h:outputText value="#{testFromSpring}" /></p>
<p>2: <h:outputText value="#{testA.test}" /></p>
...
次の出力が得られます。
1: test.Test@44d79c75
2: test.Test@53f336eb
リフレッシュ後:
1: test.Test@44d79c75
2: test.Test@89f2ac63
最初の出力が正しいことがわかります。ページを頻繁に更新してもtestFromSpring
、Spring コンテキストで定義された Bean から値が返されます。getTest
ただし、2 番目の出力は、コンポーネントのメソッドtest
が呼び出されるたびにTest
、Spring コンテキストのインスタンスを使用する代わりに、新しいインスタンスが作成されて注入されることを明確に示しています。
では、この行動の理由は何ですか?
Spring コンテキストから CDI マネージド Bean に Bean を注入するにはどうすればよいですか?
また、Spring コンテキストで定義された名前を使用して修飾子を使用しようとしましたが、Bean が見つからないことを示す例外がスローされました。
org.jboss.weld.exceptions.DeploymentException: WELD-001408 Injection point has unsatisfied dependencies. Injection point: field test.TestA.myTest; Qualifiers: [@javax.inject.Named(value=testFromSpring)]
コードの
@javax.inject.Named("testA")
public class TestA {
@javax.inject.Inject
@javax.inject.Named("testFromSpring")
private Test myTest = null;