0

私はMVCフレームワークとしてjsf2.0を使用し、依存性注入のためだけにSpringを使用しています。私はそれを機能させましたが、Spring Bean を作成するときに問題はほとんどありません。My 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 アノテーションなしで機能させる可能性はありますか。?

J2EE6依存性注入を使用するのではなく、SpringをDIとして使用したくないというもう1つの重要な質問。しかし、glassFish や JBOSS のような純粋な j2EE サーバーを使用しなければならないという 1 つの問題もあります。Tomcatで使用することは可能ですか。? Tomcat が純粋な j2ee サーバーではないことはわかっていますが、DI を使用したいだけです。

4

2 に答える 2

0

完全なスタックトレースをここに投稿する必要があります。

@AutoWired管理対象の Bean は Spring 管理対象の Bean ではないため ( が必要です)、Bean は使用して注入されませんが@ManagedProperty、それは主な問題ではありません。


根本的な原因は、Bean のコンストラクターの失敗です。私の推測では、次の行が NPE の原因であると思われます。

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

FacesContext.getCurrentInstance().getExternalContext().getSessionMap()SessionMap有効な がある場合にのみ非 null を返しますHttpSession。チェーンされたメソッド呼び出しは、これが常に当てはまると想定していますが、ここではそうではないようです。

そのコードを修正し@ManagedPropertyたら、Spring Bean を JSF Bean に注入するために使用できます (ここでは Spring MVC は必要ありません)。

関連読書:

于 2013-05-27T14:20:16.827 に答える
0

最初の問題については、JSF Bean に @Lazy アノテーションを追加してみてください。これにより、必要になるまでオブジェクトの作成が遅れます。これで起動時の例外の問題は解決しますが、問題は解決しないと思います。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>

2 番目の質問については、TomEE を参照してください。この記事には、Tomcat で CDI を直接使用する方法の詳細も記載されています。

于 2013-05-27T05:49:19.877 に答える