相关疑难解决方法(0)

使用CDI @Inject注入Spring bean

我正在尝试将Spring上下文中定义的bean注入CDI托管组件,但我没有成功.不注入bean,而是每次执行注入时都会创建一个新实例.我的环境是使用JBoss Weld的Tomcat 7.

Spring ApplicationContext是直截了当的:

<beans>
  ...
  <bean id="testFromSpring" class="test.Test" />
  ...
</bean>
Run Code Online (Sandbox Code Playgroud)

CDI托管bean看起来像这样:

@javax.inject.Named("testA")
public class TestA {

  @javax.inject.Inject
  private Test myTest = null;

  ...

  public Test getTest() {
    return this.myTest;
  }

}
Run Code Online (Sandbox Code Playgroud)

这是我的 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>
Run Code Online (Sandbox Code Playgroud)

但是,当我test从JSF页面访问该属性时,Test每次访问时都会创建一个新实例.这是一个简单的例子:

<html>
  ...
  <p>1: <h:outputText value="#{testFromSpring}" /></p>
  <p>2: <h:outputText value="#{testA.test}" /></p>
  ...
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

1: test.Test@44d79c75
2: test.Test@53f336eb
Run Code Online (Sandbox Code Playgroud)

刷新后:

1: test.Test@44d79c75
2: test.Test@89f2ac63
Run Code Online (Sandbox Code Playgroud)

我可以看到第一个输出是正确的.无论我多久刷新一次页面,都会testFromSpring返回Spring上下文中定义的bean的值.但是第二个输出清楚地表明,每次调用组件getTest上的方法时test,Test …

java jsf spring cdi jboss-weld

10
推荐指数
1
解决办法
1万
查看次数

标签 统计

cdi ×1

java ×1

jboss-weld ×1

jsf ×1

spring ×1