0

シームコンポーネントを別のコンポーネントに注入して、自動作成しようとしています。しかし、何らかの理由で、注入されたシームコンポーネントはNPEをスローします。

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;
    }


}
4

2 に答える 2

1

必須のfalseは、まさにそれを意味します。まだ存在しない場合は作成されないので、確認する必要があります。自動作成とは、inアノテーションでcreatetrueを定義する必要がないことを意味します。

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

于 2012-02-15T11:41:44.580 に答える
1

Seamは基本パッケージをスキャンして@Nameコンポーネントを探し、それらのコンポーネントは自動配線可能です。スキャンする基本パッケージを知るために、seamにseam.propertiesファイル(空)を配置することになっています。私がdintで作業していたモジュールにはseam.propertiesがあるため、RulesValidatorはスキャンされず、seamコンポーネントとして扱われていませんでした。したがって、autoCreatedintは機能します。

于 2012-02-15T20:26:05.680 に答える