【问题标题】:JSF(MVC Framework) with Spring Dependency Injection Issue (Exception at Bean Creation)具有 Spring 依赖注入问题的 JSF(MVC 框架)(创建 Bean 时出现异常)
【发布时间】:2013-05-21 22:30:30
【问题描述】:

我使用 jsf2.0 作为 MVC 框架,而 Spring 仅用于依赖注入。我让它工作但在 Spring 创建 bean 时几乎没有问题。在我的 JSFBean(ManagedBean)上意味着我必须使用 Spring 的 @Component 注解,否则我无法使其工作。因此,当我的 ManagedBean 在构造函数中有一些代码时,Spring 会抛出异常。它在没有构造函数代码的情况下完美运行。如果您需要其他任何内容,请发表评论。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'myBean' defined in file [C:\Documents and Settings\KshiS\My Documents\NetBeansProjects\Sp_Js_1\build\web\WEB-INF\classes\com\ksh\excel\MyBean.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ksh.excel.MyBean]: Constructor threw exception; nested exception is java.lang.NullPointerException 

我的 JSF Bean 代码是

package com.ksh.excel;
import java.util.ArrayList;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.springframework.beans.factory.annotation.Autowired;

/**
 *
 * @author KshiS
 */
@ManagedBean
@ViewScoped
public class MyBean {

    @Autowired
    private Userdao userdao;
    ArrayList<String> arrayList = new ArrayList<String>();

    public MyBean()
    {
        Object object = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Userid");
        if(object != null)
        {
            arrayList.add("Session Value");
        }
        else
        {
            arrayList.add("Temp Value");
        }
    }

    public void print()
    {
        System.out.println(userdao.print());
    }
}

如何解决。 ?或者是否有可能在 ManagedBean 上没有 @Component Annotation 的情况下使其工作。 ?

一个更重要的问题是我不想使用 Spring 作为 DI 而不是我想使用 J2EE6 依赖注入。但还有一个问题是我必须使用纯 j2EE 服务器,如 glassFish 或 JBOSS。是否可以在Tomcat中使用它。 ?我知道 tomcat 不是纯 j2ee 服务器但我只想使用 DI。

【问题讨论】:

    标签: spring jakarta-ee jsf-2 dependency-injection


    【解决方案1】:

    您需要在此处发布完整的堆栈跟踪。

    虽然您的 bean 不会使用 @AutoWired 注入,因为您的托管 bean 不是 Spring 托管 bean(您需要 @ManagedProperty),但这不是您的主要问题。


    根本原因是 bean 的构造函数失败。我的猜测是以下行负责 NPE。

      Object object = FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("Userid");
    

    FacesContext.getCurrentInstance().getExternalContext().getSessionMap() 只会在存在有效的HttpSession 时返回非空的SessionMap。您的链式方法调用假定这将始终是这种情况,而这里似乎并非如此。

    修复该代码后,您可以使用 @ManagedProperty 将 spring bean 注入到 JSF bean 中(这里不需要 Spring MVC。)

    相关阅读:

    【讨论】:

    • 如果我使用@ManagedProperty 这意味着这些bean 将由JSF 容器而不是由Spring 容器处理。我只想让 Jsf Beans 分离的两个不同的东西应该只由 JSF 容器处理,而 Spring Beans 由 Spring Container 处理。
    • @kshitij, @ManagedProperty 将允许您在 JSF bean 中使用 spring bean。这意味着Userdao(我假设它是一个spring bean)可以注入到JSF beanMyBean中。 @ManagedProperty 的全部意义在于您可以从不同的上下文中注入组件。但就像我说的,这不是眼前的问题。另请查看我引用的链接
    • 我喜欢@ManagedProperty 的解决方案。如果将它用于 Injection Spring Beans 是否有任何问题。
    • @kshitij 没有我知道的问题。查看相关阅读并做一些研究以解决您的疑问
    【解决方案2】:

    对于第一个问题,尝试将@Lazy 注释添加到您的 JSF bean。这将延迟对象的创建,直到需要它为止。这将解决启动时出现异常的问题 - 但我认为它不会解决问题。与 JSF 一起使用时,将不会使用 spring 创建的对象。

    看一下本文中的示例以正确执行此操作 - 使用弹簧变量解析器。 http://www.mkyong.com/jsf2/jsf-2-0-spring-integration-example/

    <?xml version="1.0" encoding="UTF-8"?>
    <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_1.xsd"
        version="2.1">
    
        <application>
            <el-resolver>
                    org.springframework.web.jsf.el.SpringBeanFacesELResolver
            </el-resolver>
        </application>
    
    </faces-config>
    

    关于第二个问题 - 你可以看看TomEE。这个article也有一些直接在tomcat中使用CDI的细节。

    【讨论】:

    • 感谢您的回复。但我已经看到了那个链接。而且我的 faces-config.xml 看起来像你的。
    • 你试过@Lazy 吗?你也可以试试@Scope("request") / @Scope("session")
    • 是的,卡马尔。它正在使用请求范围。但问题是我现在不能使用视图范围(JSF)。如果您了解它,那么 ViewScope 对我来说非常重要。而且现在所有的 bean 都将由 Spring Container 处理,甚至是我的 JSF bean。我想要 JSF 的 JSFBean。
    • 如果您不在 JSF 托管 bean 上使用 @Component 会发生什么。解析器是将依赖项注入到 JSF 组件中——你不需要让它们成为 spring bean。
    • 当时我遇到了异常。引起:javax.faces.el.E​​valuationException:java.lang.NullPointerException。
    猜你喜欢
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多