0

我将 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 注释的情况下使其工作。?

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

4

2 回答 2

0

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

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


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

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

FacesContext.getCurrentInstance().getExternalContext().getSessionMap()SessionMap如果有一个有效的HttpSession. 您的链式方法调用假定情况总是如此,而这里似乎并非如此。

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

相关阅读:

于 2013-05-27T14:20:16.827 回答
0

对于第一个问题,尝试将 @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。这篇文章也有一些关于直接在tomcat中使用CDI的细节。

于 2013-05-27T05:49:19.877 回答