[Seasar-user:21114] Re: SAStruts+S2JDBC Function内からcontainer.getComponentした場合に1回だけClassCastExceptionが発生する

Manabu Inoue [E-MAIL ADDRESS DELETED]
2011年 11月 3日 (木) 00:26:00 JST


井上です。

小林様、フォローありがとうございます。

すみません、案1という余計な物を書いていたせいでややこしくしちゃっていま
したね、、、あくまで考え方として挙げて、でも、できないですねというニュア
ンスのつもりでした。過去にMLでS2の他のフレームワークをHot Deployに対応さ
せるのにもかなり苦労されたといったような話もあったような気がしますし、今
回の場合ですとFunctionをHotDeployClassLoaderにロードさせるという話になっ
てしまいますので、結構複雑というレベルではないと思います。

>> 対策案ですが、案2だと同じクラスが違うパッケージに2個できるというこ
とですよね?
>> 特に私の場合、Serviceを2つ作ることになるので、同じ業務ロジックが2か
所に存在することになり
>> とても避けたい状況です。

Functionで必要な処理だけを切り出し、その処理についてはSmart Deploy対象ク
ラスからも切り出した先を呼ぶようにすれば、同じ業務ロジックが2箇所には
ならないかと思います。

>> 案3,4は、Serviceのクラスが大量に存在するため、そのために設定ファイル
を避けたいというのが本音です。
>> HotDeploy対象とならないというのも、開発の効率を考えると避けたいです。

これも、すべてのServiceをdiconに書くという意味ではなく、
Functionで使用するもののみにすれば大量ということにはならないかと思います
が、、、
もしかして、Functionが大量にあって、そこからDBアクセスしまくるような
形になっているのでしょうか、、、

まずは、小林様の書かれている通り、FunctionからDBアクセスするのをやめるの
を検討されるのが無難と思います。

(11/11/02 23:34), Koichi Kobayashi wrote:
> 小林 (koichik) です.
> 
> 可能であれば,
> 
>>>> JSPからEL式使ってFunctionを呼び出していますが、そのFunction内の処理にて
> (略)
>>>> を実行してServiceクラスを通じてDBにアクセスしようとしていますが、
> 
> をやめるのが無難だと思います.
> Service (DB) にアクセスするのは Action にして,その結果を
> リクエストの属性に設定,JSP (EL/Function) からはそれを参照
> するだけ.
> 
> それが難しければいろいろ諦めるしかありません.
> 少なくとも,Function から利用する Service や Dao 等を
> HOT deploy にすることはできません.
> 後はそれらをどうやって切り離すか (パッケージを分けるか,
> dicon に書くか) といった選択になります.
> 
> 
> On Wed, 2 Nov 2011 16:12:12 +0900, 泉井透<[E-MAIL ADDRESS DELETED]>  wrote:
> 
>> 井上さま
>> 有力な情報ありがとうございます。
>>
>> CoolDeployで試したところ、エラーが出なくなったので同じ現象だと確認できました。
>>
>> 対策案ですが、案2だと同じクラスが違うパッケージに2個できるということですよね?
>> 特に私の場合、Serviceを2つ作ることになるので、同じ業務ロジックが2か所に存在することになり
>> とても避けたい状況です。
>>
>> 案3,4は、Serviceのクラスが大量に存在するため、そのために設定ファイルを避けたいというのが本音です。
>> HotDeploy対象とならないというのも、開発の効率を考えると避けたいです。
>>
>> ですので、案1の方法が一番スマートに感じるのですが、
>> すべてのクラスをSmart Deploy対象にするというのは、結構複雑な問題なのでしょうか?
>> 何か情報をお持ちであれば教えて頂ければ幸いです。
>>
>> よろしくお願いします。
>>
>> 2011年11月2日1:02 Manabu Inoue<[E-MAIL ADDRESS DELETED]>:
>>
>>> 井上と申します。
>>>
>>> おそらく、Hot Deployを使用されていると思います。
>>> 私も過去にハマって調べた結果、原因や対策を以下に書きました。
>>> ご参考になれば。
>>> http://d.hatena.ne.jp/learn/20090318/p1
>>>
>>> なお、対策として幾つか書いています(書いているもの以外にリフレクションを
>>> 使う方法もあります)が、
>>> http://ml.seasar.org/archives/seasar-user/2009-February/016916.html
>>> や、ひがさんからコメントいただいているように、
>>> 基本的には案2のSmart Deploy対象外クラスから対象クラスを参照しないように
>>> するのが無難と思います。
>>>
>>> (11/11/01 23:18), 泉井透 wrote:
>>>> こんにちは。
>>>>
>>>> JSPからEL式使ってFunctionを呼び出していますが、そのFunction内の処理にて
>>>>
>>>> final S2Container container = SingletonS2ContainerFactory.getContainer();
>>>> HogeService hogeService = container.getComponent(HogeService.class);
>>>>
>>>> を実行してServiceクラスを通じてDBにアクセスしようとしていますが、下記の
>>>> ようにClassCastExceptionが発生します。
>>>> (getComponentの結果が、HogeServiceのインスタンスでない?)
>>>> java.lang.ClassCastException:
>>>> jp.xxx.xxx.service.HogeService$$EnhancedByS2AOP$$8ee5c0 cannot be cast
>>>> to jp.xxx.xxx.service.HogeService
>>>>
>>>> 発生するのは起動後、初回の1回のみで、再度そのページを実行すると同じロ
>>>> ジックが成功します(予定通り動作する)
>>>>
>>>> ちなみに、Functionを使用しているJSPに対するAction内では、普通にServiceを
>>>> DIして使用していますが特に問題は発生していません。
>>>>
>>>> どなたか心当たりがある方、解決方法を教えてください。
>>>> よろしくお願いします。
>>>>
>>>> --
>>>>
>>>> エボルブアイティワークス株式会社
>>>> 泉井 透
>>>> toru izui<[E-MAIL ADDRESS DELETED]<mailto:[E-MAIL ADDRESS DELETED]>>
>>>> http://www.evolveit.jp<http://www.evolveit.jp/>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> 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
>>>
>>
>>
>>
>> -- 
>>
>> エボルブアイティワークス株式会社
>> 泉井 透
>> toru izui<[E-MAIL ADDRESS DELETED]>
>> http://www.evolveit.jp
>> 電話:03-6457-8330
>> FAX:03-6457-8331
>> 携帯:080-1286-4715
> 
> 



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