【发布时间】:2011-05-07 20:10:07
【问题描述】:
我正在尝试将 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>
但是,当我从 JSF 页面中访问 test 属性时,每次访问都会创建一个新的 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 返回值。然而,第二个输出清楚地表明,每次调用 test 组件上的 getTest 方法时,都会创建并注入一个新的 Test 实例,而不是像我预期的那样使用 Spring 上下文中的实例。
那么,这种行为的原因是什么?
如何将 Spring 上下文中的 bean 注入 CDI 托管 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;
【问题讨论】:
-
这可能是这里缺少咖啡,但是为什么要注入您班级的私有成员(已设置为 null)。将 myTest 作为 TestA 的构造函数的一部分提供会不会更简单(例如构造函数注入)
-
注射只是一个例子,不是问题的重点。
标签: java spring jsf cdi jboss-weld