[Seasar-user:19663] Re: セッション間のコンポーネントについて

金子 雄一 [E-MAIL ADDRESS DELETED]
2010年 4月 27日 (火) 17:17:02 JST


金子と申します。


・Coolですか?Hotですか?
・customizer.diconのuseLookupAdapterの値はどうなっていますでしょうか?


下記のURLが参考になるのではないかと思います。
http://s2container.seasar.org/2.4/ja/DIContainer.html#useLookupAdapter


よろしくお願いします。


(2010/04/27 16:35), TAKEUCHI, Manabu wrote:
> 初めまして。竹内と申します。
> 
> 今回、調査目的で Teeda ベースのサンプルアプリケーション (住所録) を作成しております。
> 
> Seaser 関係は C# で S2Dao.NET などを利用させておりましたが、Java では初めてです (Java では Struts
> を利用していました)。
> 
> 利用しているライブラリは次の通りです。
> 
> s2-framework: 2.4.41
> s2-extension: 2.4.41
> s2-tiger: 2.4.41
> Teeda : 1.0.13-sp9
> 
> 今回嵌っておりますのはセッション内の DTO の共有です。
> 
> セッションで共有する DTO を addressbook.dto.SessionDto とし、@Component(instance =
> InstanceType.SESSION) で宣言してあります。
> 
> ログイン画面で承認されたユーザ情報をこの SessionDto に保存して、住所録の一覧ページなどを表示させる際にインターセプト
> (LoginInterceptor) してユーザ情報が有効か、タイムアウトなど発生していないかを確認しております。
> 
> ここまでは無事に出来ました。
> 
> さらに、利用者管理画面を作成して、そのページに進入するには管理者権限のユーザのみに限定させようと思い UserListPage
> のスーパクラス AbstractUserPage に sessionDto を DI して、prerender()
> でユーザの管理者権限を確認し、ない場合はエラーページにリダイレクトさせようと思っておりました。
> 
> が、何故か DI される sessionDto にはログイン時に設定されているはずのユーザ情報が含まれていないのです
> (まるで、別セッションのインスタンスが DI されているかのようです)。
> 
> もちろん、そのページを表示時にインターセプトしている際には、ちゃんと正常な情報が DI されています。
> 
> なぜ、LoginInterceptor と違う sessionDto が DI されるのでしょうか? また、同じ sessionDto を
> DI されるにはどうしたらよいのでしょうか?
> 
> 宜しくお願いいたします。
> 
> 
> なお、ソースは次の様な感じです。
> 
> ### addressbook.dto.SessionDto
> @Component(instance = InstanceType.SESSION)
> public class SessionDto implements Serializable {
>      private User loginUser; // ログインしたユーザ情報
> }
> 
> 
> ### addressbook.entity.User (Dolting で自動作成)
> public class User {
>      private BigDecimal id;
>      private String loginId;
>      private String password;
>      private boolean administrator;
> }
> 
> 
> ### addressbook.interceptor.LoginInterceptor
> public class LoginInterceptor extends AbstractInterceptor {
>      private SessionDto sessionDto; // これは正常に DI される。
> 
>      ... 以下略 ...
> }
> 
> 
> ### addressbook.service.LoginService
> public class LoginService {
>      private UserDao userDao; // これは何故か DI されず、null のまま
>      private SessionDto sessionDto;  // これも正常に DI されている。
> 
>      public User tryLogin(String loginId, String password) {
>          User user = userDao.selectByLoginId(loginId);
>          if (user == null || !user.getPassword().equals(password)) {
>              user = null;
>          }
>          sessionDto.setLoginUser(user);  // ここでログイン ユーザ情報を設定
>          return user;
>      }
> }
> 
> 
> ### addressbook.web.login.LoginPage
> public class LoginPage {
>      private UserDao userDao; // 正常に DI されている。
> 
>      public Class<?>  doLogin() {
>          loginService.setUserDao(userDao); // 何故か DI されないのでここで設定
>          User user = loginService.tryLogin(loginId, password);
>                  if (user != null) {
>                          return PersonListPage.class; // 住所録の一覧ページへ
>                  }
>                  return null;
>          }
> }
> 
> 
> ### addressbook.web.user.AbstractUserPage (Dolting で自動作成)
> public abstract class AbstractUserPage extends AbstractCrudPage {
>      protected SessionDto sessionDto; // これは DI されるけど別セッションの情報か?
> loginUser は null のまま。
> }
> 
> 
> ### addressbook.web.user.UserListPage (Dolting で自動作成)
> public class UserListPage extends AbstractUserPage {
>      public Class<?>  prerender() {
>          if (sessionDto.getLoginUser() == null ||
> !sessionDto.getLoginUser().getAdministrator()) {
>              // loginUser は常に null なので、エラーページへ
>              return ErrorNoAdminPage.class;
>          }
>          ... 以下略 ...
>      }
> }
> 
> 
> ### app_aop.dicon
>      <!-- 追加部分 -->
>      <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
>        <property name="autoNaming">
>          <component
> class="org.seasar.framework.container.autoregister.DefaultAutoNaming"
> />
>        </property>
> 
>        <initMethod name="addClassPattern">
>          <arg>"addressbook.interceptor"</arg>
>          <arg>".*Interceptor"</arg>
>        </initMethod>
> 
>        <initMethod name="addClassPattern">
>          <arg>"addressbook.dto"</arg>
>          <arg>".*Dto"</arg>
>        </initMethod>
> 
>        <initMethod name="addClassPattern">
>          <arg>"addressbook.service"</arg>
>          <arg>".*Service"</arg>
>        </initMethod>
>      </component>
> 
> 


-- 
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
株式会社プラスサム
金子 雄一  Yuichi Kaneko
〒330-0854
埼玉県さいたま市大宮区桜木町2-7-4
プラスサムビル
Tel: 048-650-9777 Fax: 048-650-9778
E-mail : [E-MAIL ADDRESS DELETED]
http://www.plus-sum.co.jp/
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆


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