[Seasar-user:1227] S2.1.x の暗黙オブジェクトについて

Sadanori ITO sito_dev
2004年 11月 27日 (土) 05:12:27 JST


伊藤です。

S2.1 から追加になった暗黙オブジェクト(このプロジェクトではマジック
コンポーネントと呼んだ方が良いのかな?)について気づいた点を
ご報告します。

[ 事象 ]

追加になった暗黙オブジェクトの登録名と名前空間で指定していた
"response" がバッティングするために以下の例外が発生します。

例外:
org.seasar.framework.container.TooManyRegistrationRuntimeException

メッセージ:
[ESSR0045]responseに複数のコンポーネント
(javax.servlet.http.HttpServletResponse,
org.seasar.framework.container.impl.S2ContainerImpl)が登録されています


[ 経緯 ]

開発中のアプリケーションで使っている *.dicon の中に "response.dicon"
が存在しました。

今まではインタフェースでコンポーネントを取得していたため,気付くのが
遅れてしまいましたが,名前空間指定を行ってコンポーネント名で取得する
必要が生じたことでようやく問題が発覚しました。

例)
global.foo.response.bar

※ S2Tapestry を使用しているため,上記のような名前指定になっています。


[ 回避策 ]

アプリ側での回避策としては何通りか考えられますが,

案1: 素直にファイル名および名前空間の指定を変更する
案2: ドキュメントで推奨されている命名規則を無視して名前空間の指定のみ
      変更する
  @see  http://homepage3.nifty.com/seasar/DIContainer.html#Namespace
案3: 名前空間の利点を捨てて global.foo.bar でコンテナの検索に頼る
案4: S2.0.x を使用する

等になりますでしょうか?
割と後ろ向きな案ばかりになってしまいましたが...

[ 要望 ]

1. ユーザが指定する名前空間とコンテナが暗黙的に使用する名前空間が
   別々になっていると嬉しかったです。
   ※ もちろん,今からの変更は難しいと思いますので,過去形です。

   予約された名前空間として "s2" のみ存在し,暗黙オブジェクトは
   すべてその配下に置かれるとか。

2. インタフェースで取得する場合と,名前で取得する場合の挙動が
   一致しているほうが理解しやすい気がします。
   ※ とは言え,これも今から変えると影響が大きそうですね...

3. せめて,暗黙オブジェクトと同じ名前で S2ContainerImpl が登録
   されそうになった段階で警告が出ると親切かも知れません。

4. というか,中心となるインタフェースである S2Container に
   javax.servlet.* がインポートされたのが少し残念です。

   Web アプリでは気になりませんが,Web とまったく無関係なアプリでも
   servlet.jar が意味もなく必要になるのが...

   S2JSF の影響が大きいのだとは思いますが,以前の S2ContainerServlet
   のように S2Container(Filter|Servlet) と連携する場合のみ関係する機能
   だと良かったかと思います。

-----

現実的な線では,要望 3 辺りに落ち着くと思いますので,本来なら勉強を
兼ねてソースを眺めながらパッチが作れるかどうか検討したいところですが,
今回は取り急ぎご報告まで。

いつも簡潔にまとめたいと思うのですが,長文になってしまい
申し訳ありません。

以上です。
ご検討の程よろしくお願い致します。

-- 
s.ito





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