【问题标题】:Spring beans injected into JSF Managed Beans注入 JSF Managed Beans 的 Spring bean
【发布时间】:2011-09-05 18:44:29
【问题描述】:

问题描述:我注入的 Spring bean 定义为 JSF 支持 bean 的托管属性,但没有被实例化。当我检索托管 Bean 时,它总是出现空值。

我整天都在与这个作斗争,似乎 JSF 托管 Bean 不会从 Spring 中读取 applicationContext。我可以通过在支持 bean 中使用 FacesContext 手动拉出 bean,它会找到 bean,但是当我尝试通过 FacesConfig 注入它时,它总是显示为空。我在如何集成它下面包含了我的步骤。有什么建议?

配置

冰面 1.85

JSF 1.2(通过 ice faces servlet)

春季 3.0

Websphere 7.5(我认为是 eclipse 3.5)

Web.xml 配置更改

Spring 上下文加载器监听器

    <listener>
    <display-name>SpringListener</display-name>
    <icon>
        <small-icon>small.gif</small-icon>
        <large-icon>large.gif</large-icon>
    </icon>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

上下文配置

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/SpringConfig/SpringHelloWorld.xml
    </param-value> 
</context-param>

FacesContext 变化

变量解析器 - 又名胶水

&lt;application&gt;&lt;variable-resolver&gt;org.springframework.web.jsf.DelegatingVariableResolver&lt;/variable-resolver&gt;&lt;/application&gt;

托管 Bean

   <managed-bean>
    <managed-bean-name>testData</managed-bean-name>
    <managed-bean-class>src.test.TestData</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
        <property-name>spring3HelloWorldBean</property-name>
        <value>#{spring3HelloWorldBean}</value>
    </managed-property>
</managed-bean>

Spring.xml 配置

<bean id="spring3HelloWorldBean" class="src.test.Spring3HelloWorld" />

提前致谢

【问题讨论】:

    标签: spring jsf configuration


    【解决方案1】:

    首先,我认为这是您的问题,即 DelegatingVariableResolver 在 1.1 之后的所有 JSF 版本中均已弃用,而您使用的是 1.2,因此请使用以下配置。

    <application> 
    <el-resolver> 
    org.springframework.web.jsf.el.SpringBeanFacesELResolver 
    </el-resolver> 
    </application>
    

    希望对你有帮助。

    【讨论】:

    • 谢谢,我明天第一件事就试一试。我确实尝试过使用 el-resolver,但我认为不是那个类。我明天更新。为帮助干杯。
    • @Bozho 和 @danny.lesnik 似乎没有用。我遗漏的一个关键信息是我也在使用 Icefaces 1.8 ,它使用 jsf 1.2 。不确定这是否会有所作为。使用 contextLoader 侦听器时,它不需要任何类型的“加载”优先级,就像您使用 contextLoadServlet 设置的那样?
    • @haju - 您是否尝试过我的注释建议?有用吗?
    • @Bozho 什么spring jar 有Inject 注解?我将所有弹簧罐添加到构建路径中,但似乎找不到它。我不必使用 Controller 注释来正确使用注入吗?我仍然可以定义一个 jsf 托管 bean,并在该 bean 的类中使用 spring bean 的注入注释对吗?
    • 它是 jsr-330,但你可以使用 @Autowired 代替 - 它是一样的
    【解决方案2】:

    除了使用SpringBeanFacesELResolver,您还可以通过使用注解从spring 中获益更多。因此,不要在 xml 中定义托管 bean,只需执行以下操作:

    @Controller
    public class FooBean {
        @Inject
        private SpringService service;
        ....
    }
    

    【讨论】:

    • 这是否意味着我根本不需要在 facescontext 中定义 bean?相同的@Inject 是否也适用于注入另一个托管 bean?我想是的。
    • @haju - 是的。所有托管 bean 都将存在于 spring 上下文中。 (您只需将他们的包包含在component-scan 中)
    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 2012-05-22
    • 2014-02-02
    • 1970-01-01
    • 2013-06-25
    • 2014-07-01
    • 2011-08-16
    • 2011-07-16
    相关资源
    最近更新 更多