2012-02-15 8 views
0

シームコンポーネントを別のコンポーネントに注入しようとしていますが、それを自動作成しています。しかし何らかの理由で、注入されたシーム成分がNPEを投げる。まさにその偽の手段を必要Seam AutoCreateが機能しません。

XHTML

    <a4j:commandLink id="cbrModal" 
            action="#{detailAction.showInformation(1L)}" 
            reRender="DetailModal" 
            limitToList="true"> 
         <h:outputText value="text"/> 

        </a4j:commandLink> 

DetailActionBean.java

@Name("detailAction") 
public class DetailActionBean implements Serializable { 

    @In(create = true, required = false) 
    @Out(required = false) 
    private RulesValidator rulesValidator; 

    public void showInformation(long id) { 

       rulesValidator.setCheckCount(0); // rulesValidator == null here and throws npe 

    } 
) 

RulesValidator.java

@AutoCreate 
@Name("rulesValidator") 
@Scope(ScopeType.SESSION) 
public class RulesValidator implements Serializable { 

    private int checkCount = 0; 
    public void setCheckCount(int checkCount) { 
     this.checkCount = checkCount; 
    } 


} 

答えて

1

Seamは基本パッケージをスキャンして@Nameコンポーネントを探し、それらのコンポーネントは自動配線可能です。 seam.propertiesファイル(空)を入れて、seamがどの基本パッケージをスキャンするかを知っておく必要があります。私がdintで作業していたモジュールにはseam.propertiesがあり、RulesValidatorはスキャンされておらず、継ぎ目のコンポーネントとして扱われていませんでした。したがって、autoCreate dint work。

1

。まだ存在しない場合は作成されませんので、確認してください。 Autocreateとは、注釈に対してcreate trueを定義する必要はありません。

コメントの更新: はいこの注釈がpresemtの場合、seamは注入時のコンポーネントを自動作成します。しかし、あなたはそれが必須ではないことを注射に述べています!なぜシームは何もしません。あなたの@Inのすべてのプロパティを削除するだけで動作するはずです。デフォルトはあなたが望むものです。

+0

Seam docs say、AutoCreate @Inがcreate = trueを指定していない場合でも、要求されるたびにこのコンポーネントを自動的にインスタンス化する必要があることを指定します。 '@作成する必要があるのですか? public void init(){ rulesValidator = new rulesValidator(); } 'これを行うと、私はrulesValidatorのインスタンス変数を呼び出すたびに初期化されます。 –

+0

明確にするために、 'rulesValidator.setCheckCount(0);'を実行して、NPEチェックを行い、呼び出しをバイパスするだけです。 –

関連する問題