[cubby-user:143] Re: Cubby on GAEで、DTOを@Injectしたい。

Takashi Someda [E-MAIL ADDRESS DELETED]
2009年 5月 8日 (金) 01:24:08 JST


染田です。

> 理由は、異なるページ間で 同じ型の@SessionScopedのDtoの値を共有化したいと
> 思っていて、試行錯誤中です。@Inject HttpSession session で遠まわしに実現
> できることは分かっているのですが、スマートにできないかと思っています。

イメージされているようなものと近ければよいのですが、
SessionScoped を利用するサンプルを追加してみました。
# ちょっと手抜きで一つの Action で同じ Dto を SessionScoped で
# 使い回してますが、基本的に別 Action でも同じようになるはず。

- http://cubby-example.appspot.com/search/

ソースもあげており、SearchAction と SearchDto 辺りを見て頂ければ、と。

- https://www.seasar.org/svn/cubby/branches/2.0.x/cubby-apps/cubby-example-gae

ざっくりいうと、SessionScoped な SearchDto
を、SearchAction でこんな感じで使ってます。

	public SearchDto getSearchDto() {
		return this.searchDto;
	}

	@Inject
	public void setSearchDto(SearchDto searchDto) {
		this.searchDto = searchDto;
	}

	public ActionResult index() throws Exception {
		return new Forward("index.jsp");
	}

	@Form("searchDto")
	@Accept(RequestMethod.POST)
	public ActionResult search() throws Exception {
		return new Forward("search.jsp");
	}

振る舞いとしては、

1) Action のコンテナからの取得時に、searchDto は
Guice によって binding されます。(@Inject の挙動)
なので、/search/ のアクセス時にも /search/search でも
searchDto は設定されます。

2) フォームの入力値を Dto に詰め込んで渡す場合ですが、
その場合は、@Form で指定した名前の Dto を取得して、
値をバインディングします。これは、@Inject 後に行われます。

以下の Exception はおそらくそのパターンかな、と思うのですが、
違いますでしょうか?

> org.seasar.cubby.spi.beans.PropertyNotFoundException: クラス xxxx.SearchAction のプロパティ searchDto が見つかりません
>        at org.seasar.cubby.spi.beans.impl.DefaultBeanDescProvider$BeanDescImpl.getPropertyDesc(DefaultBeanDescProvider.java:143)

Seasar で利用している場合 InterType で暗黙的に getter をつけているのですが、
Guice では、そういった処理が Action に対してなされていないので、
明示的に getter を作成する必要があります。(はずです、間違ってたら突っ込みお願いします m(_ _)m)

> ApplicationModule内で、bind( @SessionScopedなDTOクラス );
> のようなことをしましたが、うまくいかないようです。

AbstractCubbyModule で、ServletModule を install して
いるので、基本的に手で bind する必要はないはずです。

以上です。参考になれば幸いです。

2009/05/07 21:34 かとちん <[E-MAIL ADDRESS DELETED]>:
> かとちんと申します。
>
> Cubby on GAE を試させていただいています。
> https://www.seasar.org/svn/cubby/branches/2.0.x/cubby-apps/cubby-example-gae
>
> パラメータ渡しの例がサンプルには含まれていますが、
> @RequestScoped や @SessionScoped を付属した Dto を、
> Action内のフィールドに @Inject できないかを調査しています。
>
> 理由は、異なるページ間で 同じ型の@SessionScopedのDtoの値を共有化したいと
> 思っていて、試行錯誤中です。@Inject HttpSession session で遠まわしに実現
> できることは分かっているのですが、スマートにできないかと思っています。
>
>
> ApplicationModule内で、bind( @SessionScopedなDTOクラス );
> のようなことをしましたが、うまくいかないようです。
> 普通のゲッターが呼ばれているようでguiceが絡んでいないように見受けられます。
>
> org.seasar.cubby.spi.beans.PropertyNotFoundException: クラス xxxx.SearchAction のプロパティ searchDto が見つかりません
>        at org.seasar.cubby.spi.beans.impl.DefaultBeanDescProvider$BeanDescImpl.getPropertyDesc(DefaultBeanDescProvider.java:143)
>        at org.seasar.cubby.internal.action.impl.ActionContextImpl.getFormBean(ActionContextImpl.java:133)
>        at org.seasar.cubby.handler.impl.ParameterBindingActionHandler.handle(ParameterBindingActionHandler.java:64)
>        at org.seasar.cubby.handler.impl.ActionHandlerChainImpl.chain(ActionHandlerChainImpl.java:57)
>
> guiceとの連携のさせ方を私がよく分かっていないだけのような気もしていますが、
> なにか良策ありましたら、教えていただけると幸いです。
> よろしくお願いします。
>
> _______________________________________________
> cubby-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/cubby-user
>



-- 
SOMEDA Takashi
[E-MAIL ADDRESS DELETED]
blog :     http://d.hatena.ne.jp/tksmd/


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