[Seasar-user:10843] Re: Componentアノテーションで登録したコンポーネントがPageクラスでバインドできない

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 10月 2日 (火) 22:00:55 JST


小林 (koichik) です.

Date:    Tue, 2 Oct 2007 20:55:46 +0900
From:    "Shinichi Yanagisawa" <[E-MAIL ADDRESS DELETED]>
To:       <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:10841] Componentアノテーションで登録したコンポーネントがPageクラスでバインドできない

> これで実行したところ、下記のような例外が発生しました。
>  org.seasar.framework.beans.IllegalPropertyRuntimeException: [ESSR0059]クラス(shopping.web.user.EntryUserPage$$EnhancedByS2AOP$$1451fb5)のプロパティ(jobCodeSet)の設定に失敗しました。理由はorg.seasar.framework.exception.OgnlRuntimeException: [ESSR0073]OGNLで例外が
> 発生しました。理由は[ESSR0046]コンポーネント(jobCodeSet)が見つかりません

JobCodeSet がコンポーネントとしてコンテナに
登録されていないためでしょう.

@Component アノテーションは,そのクラスが
どのようなコンポーネントなのかを指定するものです.
アノテーションを付けただけでコンテナに自動登録
されるわけではありません.

Seasar2 では,コンポーネントをコンテナに
登録する方法が複数あります.

・dicon ファイルに明示的に登録する
・AutoRegister を使う.
・SMART deploy を使う.

JobCodeSet のような 〜CodeSet がたくさんあるなら
SMART deploy,そうでなければ明示的に登録するのが
いいと思います.

dicon に明示的に登録するなら,app.dicon に

<component name="jobCodeSet" class="shopping.code.JobCodeSet"/>

と定義してください.
JobCodeSet の @Component アノテーションは
なくても構いません.

SMART deploy を使う場合は,自動登録されるクラスは
パッケージやクラス名が以下のドキュメントにある
規約に従う必要があります.

http://s2container.seasar.org/2.4/ja/DIContainer.html#SMARTdeploy

今回の場合,JobCodeSet という名前は (標準の)
規約に従っていないため,自動登録の対象とは
なりません.
例えばこれを

package shopping.helper;
@Component(instance=InstanceType.SINGLETON)
public class JobCodeSetHelper implements Serializable {
  ...
}

として,

public class EntryUserPage implements Serializable {
  private static final long serialVersionUID = 1L;
  @Binding(bindingType=BindingType.MUST)
  private JobCodeSetHelper jobCodeSetHelper;
  ...
}

のようにすれば SMART deploy で自動登録されると
思います.

〜Helper のようにしたくない場合は,そのコンポーネント用の
Creator を作成して creator.dicon に登録するなどの必要が
あります.customizer.dicon も変更が必要です.
少々手間がかかるので,標準の規約に従うことをオススメ
します.


--
<signature>
   <name>Koichi Kobayashi</name>
   <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内