[Seasar-user:21194] Re: HotDeployモードでMethodクラスからアノテーションが取得できない

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2011年 12月 7日 (水) 02:45:06 JST


小林 (koichik) です.

久保さんが書いているように,RequestProcessor は
HOT deploy の外で通常のクラスローダに読み込まれてしまいます.
Filter や Listener,Servlet なども含めて,HTTP リクエストが
飛んでくる前に初期化されるものはどれも HOT 非対象です.


On Wed, 7 Dec 2011 01:49:58 +0900, kubo <[E-MAIL ADDRESS DELETED]> wrote:

> 久保(jflute)です。
> 
> > ・src\main\resources\convention.dicon
> > ・src\main\webapp\WEB-INF\classes\convention.dicon
> >
> > 私の環境でも上記二か所にファイルは存在したのですが、その同期が
> > 取れていなかったらしく、後者の方にaddIgnorePackageNameが未適用
> > だったことが原因でした。
> 
> WEB-INF\classes配下は、通常はEclipseでコンパイルされたら
> 出力される場所なので、手動で修正する必要はないはずと思われますが、
> convention.diconを修正したときに、何かしら別にエラーが発生していて、
> コンパイルが通らずsrc/main/resourcesのconvention.diconが
> WEB-iNF/classes配下にコピーされなったのではないかと想像します。
> 
> コンパイルが正常な状態で、試しに
> src/main/resourcesのconvention.diconだけを何かしら修正して保存して、
> WEB-INF/classes配下のconvention.diconを確認してみてください。
> 
> > ただそうすると、SUGRequestProcessorもルートパッケージ配下にあるので
> > SMART deploy対象ではないが、HOT deploy対象となりますよね。
> > であれば
> > 「HOT deploy対象のクラスをHOT deploy非対象のクラスから触る」
> > ことにならないのでは…?
> 
> ちょっと難しい話なので自分も説明が乏しくなってしまいますが、
> 「明示的にdiconに登録されたりしていなければ」の他にも、
> システムクラスローダーに先に読まれるコンポーネントは、
> HotDeploy対象とはならないはずです。RequestProcessorは、
> インスタンスがStrutsに管理されるクラスだと思うので、
> HotDeploy対象にはならないかと。
> 
> 
> 2011/12/7 Shouta Morimoto <[E-MAIL ADDRESS DELETED]>:
> > 竹添様、久保様
> >
> > こんばんわ、森本です。
> >
> >
> > ご確認ありがとうございました。
> > 改めてふと自分の環境で確認してみると事象が再現しなくなっていたので
> > よくよく確認してみると、原因がわかりました。
> >
> > Doltengでプロジェクトを作成すると、convention.diconは以下二か所に
> > 作成されるようです。
> >
> > ・src\main\resources\convention.dicon
> > ・src\main\webapp\WEB-INF\classes\convention.dicon
> >
> > 私の環境でも上記二か所にファイルは存在したのですが、その同期が
> > 取れていなかったらしく、後者の方にaddIgnorePackageNameが未適用
> > だったことが原因でした。
> > お手数をおかけしてしまい大変申し訳ありませんでした。
> >
> >
> > >久保様
> >
> >>> しかし「Seasar2徹底入門」のP97にある通り、SMART deploy対象パッケージは
> >>> 特に何も設定しない限り、action, form, dao, dto, interceptor, serviceの
> >>> 6つのみで、annotationパッケージはSMART deployの自動登録対象外では
> >>> ないのでしょうか?
> >> たぶん、HotDeploy対象という話とSmartDeploy対象の話は
> >> 厳密には別の話になるかと自分は認識しています。
> >> SmartDeploy対象であろうとなかろうとルートパッケージ配下の
> >> クラスは、基本的にはHotDeploy対象になると。
> >> (明示的にdiconに登録されたりしていなければ)
> >
> > ご指摘ありがとうございます。
> > SMART deploy対象とHOT deploy対象は違うのですね…。
> > 上記6パッケージはあくまで「自動コンポーネント登録」される対象であって
> > HOT deploy対象として、リクエスト毎に新たにクラスがロードされるのは
> > ルートパッケージ配下すべてのコンポーネントであると理解しました。
> >
> > ただそうすると、SUGRequestProcessorもルートパッケージ配下にあるので
> > SMART deploy対象ではないが、HOT deploy対象となりますよね。
> > であれば
> > 「HOT deploy対象のクラスをHOT deploy非対象のクラスから触る」
> > ことにならないのでは…?
> >
> > 問題は解決したのですが、後学のためにお教え頂けますと幸いです。
> >
> > 以上、よろしくお願いいたします。
> >
> > (2011/12/06 19:40), Naoki Takezoe wrote:
> >> 竹添です。
> >>
> >> 手元の環境でバージョンをあわせて試してみました。
> >>
> >> ? - sa-struts-1.0.4-sp8.jar
> >> ? - struts-1.2.9.jar
> >> ? - s2-framework-2.4.41.jar
> >> ? - s2-tiger-2.4.41.jar
> >> ? - s2-extension-2.4.41.jar
> >>
> >> convention.diconでアノテーションのパッケージを
> >> addIgnorePackageしたところ、getAnnotation(Auth.class)で
> >> 問題なくアノテーションが取得できているように見えます。
> >>
> >> 森本さんのケースで取得できないのは何か他に原因が
> >> あるのかもしれません。
> >>
> >> 2011年12月6日18:54 Naoki Takezoe<[E-MAIL ADDRESS DELETED]>:
> >>> 竹添です。
> >>>
> >>> 2011年12月6日17:30 Shouta Morimoto<[E-MAIL ADDRESS DELETED]>:
> >>>> 「HOT deploy対象のクラスをHOT deploy非対象のクラスから触る」
> >>>> ということは今回の例でいうと
> >>>>
> >>>> HOT deploy対象のクラス =Authクラス ? ? ? ? ? ? ? ? ? ? ? を
> >>>> HOT deploy非対象のクラス=SUGRequestProcessorクラス ? ? ? ?から触る。
> >>>>
> >>>> ということをおっしゃっているのだと理解しました。
> >>>>
> >>>> しかし「Seasar2徹底入門」のP97にある通り、SMART deploy対象パッケージは
> >>>> 特に何も設定しない限り、action, form, dao, dto, interceptor, serviceの
> >>>> 6つのみで、annotationパッケージはSMART deployの自動登録対象外では
> >>>> ないのでしょうか?
> >>>
> >>> すいません。addIgnorePackageNameでアノテーションのパッケージを
> >>> 指定されているのを見落としていました。久保さんも書かれている通り、
> >>> たしかにaddIgnorePackageNameで指定しているのに毎回リロードされて
> >>> いるのはおかしい気がしますね。
> >>>
> >>> 時間があれば手元でも試してみようと思います。
> >>>
> >>>>> # 書籍のサンプルでは実際の型に触れないようになっているのですが、
> >>>>> # 敢えてAuthクラスを触るように変更されているのにはもしかして何か
> >>>>> # 理由がおありでしょうか?
> >>>>
> >>>> 上記に関しては「Seasar2徹底入門」のP266〜P267の例に従って
> >>>> 記載したつもりだったのですが…。
> >>>> 何か根本的に勘違いしていたら大変恐縮なのですが、
> >>>> 今一度ご教示頂けますと幸いです。
> >>>
> >>> 失礼しました。P263ではなくP267のようにaddIgnorePackageNameを
> >>> 指定したうえで getAnnotation(Auth.class) されていたということですね。
> >>>
> >>> 上記の通り、その通りであればたしかにおかしいなと思います。
> >>>
> >>> --
> >>> Naoki Takezoe
> >>
> >>
> >>
> > _______________________________________________
> > Seasar-user mailing list
> > [E-MAIL ADDRESS DELETED]
> > https://ml.seasar.org/mailman/listinfo/seasar-user
> _______________________________________________
> Seasar-user mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-user


-- 
{
  name: "Koichi Kobayashi",
  mail: "[E-MAIL ADDRESS DELETED]",
  blog: "http://d.hatena.ne.jp/koichik/",
  twitter: "@koichik"
}



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