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

Shouta Morimoto [E-MAIL ADDRESS DELETED]
2011年 11月 21日 (月) 00:01:54 JST


森本と申します。
件名の件について質問させてください。

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 メーリングリストの案内