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