[Seasar-user:21165] Re: 自動バインディングの適用範囲について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2011年 11月 21日 (月) 01:10:01 JST


小林 (koichik) です.

Test クラスは自動登録ではないと思いますが,dicon に
記述していますか? それは app.dicon ですか?

SMART deploy による自動登録は通常 app.dicon をインクルード
しているルートのコンテナに対して行われます.
そのため,app.dicon からインクルードされる別の dicon に
Test クラスを定義した場合,そのコンテナ (dicon) からは
自動登録されたコンポーネントは見えません.

S2Unit を使った場合,通常は自動登録されるルートのコンテナに
app.dicon がインクルードされるため,Test をapp.dicon に
定義してもそのコンテナ (app.dicon) からは自動登録された
コンポーネントは見えません.
その場合は getRootDicon() をオーバーライドする必要があります.

public String getRootDicon() {
  return "app.dicon";
}

S2Unit4 の場合はアノテーションで指定することができます.

http://s2container.seasar.org/2.4/ja/S2JUnit4.html#rootDiconAnnotation


On Mon, 21 Nov 2011 00:01:54 +0900, Shouta Morimoto <[E-MAIL ADDRESS DELETED]> wrote:

> 森本と申します。
> 件名の件について質問させてください。
> 
> SAStrutsにて作成しているWebアプリケーションにおいて、
> 自動バインディングが思ったように動いておりません。
> 
> 具体的には<rootパッケージ名>.serviceパッケージ内の
> CompetitionUserService.javaを
> <rootパッケージ名>.util.portalパッケージ内の
> Test.java内のプロパティにDIしたいと思っています。
> 
> ■--------状況説明ここから--------■
> 
> CompetitionUserService.javaの内容は以下の通りです。
> ---------------------------------------------------------
> package <rootパッケージ名>.service;
> 
> import java.util.List;
> import javax.annotation.Generated;
> import javax.persistence.EntityExistsException;
> 
> import <rootパッケージ名>.entity.CompetitionUser;
> 
> import static org.seasar.extension.jdbc.operation.Operations.*;
> import static <rootパッケージ名>.entity.CompetitionUserNames.*;
> 
> /**
>  * {@link CompetitionUser}のサービスクラスです。
>  *
>  */
> public class CompetitionUserService extends
> AbstractService<CompetitionUser> {
> 
>   /**
>    * 識別子でエンティティを検索します。
>    *
>    * @param id
>    *          識別子
>    * @return エンティティ
>    */
>   public CompetitionUser findById(Integer id) {
>     return select().id(id).getSingleResult();
>   }
> 
>   /**
>    * 識別子の昇順ですべてのエンティティを検索します。
>    *
>    * @return エンティティのリスト
>    */
>   public List<CompetitionUser> findAllOrderById() {
>     return select().orderBy(asc(id())).getResultList();
>   }
> 
>   /**
>    * UserIDが一致するエンティティを検索します。
>    *
>    * @param id
>    * @return
>    */
>   public List<CompetitionUser> findByUserId(Integer id) {
>     String whereCond = "USER_ID = ?";
>     return select().where(whereCond, id).getResultList();
>   }
> 
> }
> ---------------------------------------------------------
> 
> Test.javaの内容は以下の通りです。
> DIしたい部分についてもコメントにて明記します。
> ---------------------------------------------------------
> package <rootパッケージ名>.util.portal;
> 
> import javax.annotation.Resource;
> 
> import <rootパッケージ名>.entity.User;
> import <rootパッケージ名>.service.CompetitionUserService;
> 
> public class Test implements Notifiable {
> 
>   @Resource
>   protected CompetitionUserService competitionUserService;
> //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> // ここがDIされずにnullとなってしまう!!!
> 
>   @Override
>   public Notification getNotification(User user) {
>     if (competitionUserService.findByUserId(user.id) != null) {
>       Notification notification = new Notification(notifyString,
> notifyURL);
>       return notification;
>     }
> 
>     return null;
>   }
> 
> }
> ---------------------------------------------------------
> ■--------状況説明ここまで--------■
> 
> 
> ■--------調査状況説明ここから--------■
> 
> 自分としては下記URLを参考にして調べてみました。
> 
> http://s2container.seasar.org/2.4/ja/DIContainer.html#AutoBindingMode
> 
> すべての条件を確認した結果は以下の通り問題なさそうに見えています。
> 以下、すべての条件について現在の状況をご説明します。
> 
> ・コンストラクタ・インジェクションが明示的に指定されている場合、自動バイ
> ンディングは適用されません。
> ⇒上記の通り指定していない。
> 
> ・引数のないデフォルトコンストラクタが定義されている場合、自動バインディ
> ングは適用されません。
> ⇒上記の通りコンストラクタ自体作成していない
> 
> ・引数の型がすべてインターフェースで最も引数の数の多いコンストラクタを選
> 択され、その引数の型のコンポーネントが設定されます。
> ⇒上記の通りコンストラクタ自体作成していない
> 
> ・セッター・インジェクションが明示的に指定されている場合、自動バインディ
> ングは適用されません。
> ⇒diconでは指定していない。
> 
> ・プロパティの型を実装したコンポーネントがコンテナに1つ登録されていて、
> プロパティ名とコンポーネント名が一致する場合、そのコンポーネントが設定さ
> れます。ただい、コンポーネント名にaaa_のようにサブパッケージ名がプレ
> フィックスでついている場合、にサブパッケージ名のプレフィックスは除いて、
> プロパティ名と比較します。コンポーネント名については、こちらを参照してく
> ださい。
> ⇒これに当てはまっているはずだがDIされない。
> 
> ・プロパティ名と同一のコンポーネントがコンテナに登録されていて、プロパ
> ティに代入可能なら、 そのコンポーネントが設定されます。
> ・プロパティの型がインターフェースの場合、コンテナをその型で検索し、見つ
> かったコンポーネントが設定されます。ただし、複数のコンポーネントが見つ
> かった場合には、TooManyRegistrationRuntimeExceptionがスローされます。
> ・プロパティの型がインターフェースの配列の場合、コンテナをその型で検索
> し、見つかったコンポーネントの配列が設定されます。
> ⇒上記で当てはまっているはずなので、関係ないはず。
> 
> ■--------調査状況説明ここまで--------■
> 
> CompetitionUserService.javaはserviceパッケージ配下にあるため
> コンポーネント登録は自動で行われていると認識しておりますが、
> もしかしてComponentの自動バインディングの範囲について制限が
> ございますでしょうか?
> (例えばactionパッケージ配下にあるクラスにしか自動バインディング
>  されないなど。)
> 
> 
> 以上、恐れ入りますが状況がお分かりの方がいらっしゃれば
> お教え頂ければ幸いです。
> 
> ■開発環境
> OS:Windows 7 Home Premium (64bit)
> ブラウザ: Firefox3.6.13
> DB: mysql5.5
> コンパイラ: jdk1.6.0_22
> 使用中のライブラリ:(Jarを一部抜粋)
>   - sa-struts-1.0.4-sp8.jar
>   - struts-1.2.9.jar
>   - mysql-connector-java-5.1.14-bin.jar
>   - s2-framework-2.4.41.jar
>   - s2-tiger-2.4.41.jar
>   - s2-extension-2.4.41.jar
>   - s2jdbc-gen-2.4.41.jar
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user


-- 
{
  name: "Koichi Kobayashi",
  mail: "[E-MAIL ADDRESS DELETED]",
  blog: "http://d.hatena.ne.jp/koichik/",
  twitter: "@koichik"
}



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