-
1. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
t-minami Apr 9, 2012 9:14 PM (in response to takuyaaa)nakamura takuyaさんはじめまして。
そこで、WebLogic 11gとJBossAS7.1.0Finalの、ArrayListの仕様の差異が影響しているの
ではないかと考えております。
(「WebLogic 11gではArrayListはaddした順序でiterator取得することができるが、
JBossAS7.1.0Finalではaddした順序は保持しない」などといった仕様の差異。)心当たりのある方いらっしゃいましたら、ご教示いただけたらと思います。
よろしくお願い致します。
まずArrayListについてですが、WebLogicやJBoss固有のクラスではなく、通常のJavaAPIのArrayList(java.util.ArrayList)をお使いなのであれば、
iterator()メソッドの実行結果として順序が変わる、ということは考えにくいと思います。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/AbstractList.html#iterator()
上記のjavadocにも「このリスト内の要素を適切な順序で繰り返し処理する反復子を返します。この実装は、反復子インタフェースの簡単な実装を返します。
この処理では、基になるリストの size()、get(int)、および remove(int) といった各メソッドを利用します。」
と記載されています。
今回の場合、
javaプログラムを確認したところ、EJBオブジェクトの中で、DB検索し、一つずつ取得し、
ドロップダウンの選択肢をArrayListにaddしているようでした。上記DBから取得する箇所で、ArrayListにaddする時点で既に順序が変わっている、というケースが可能性として最も高いと思います。
EJBからどのようにDB検索を行っているかはご質問内容からは読み取れませんでしたが、まずはArrayListにaddしている値をデバッガやログ等で
表示するなどして、正しい順序で取得できているかどうかを確認してみてはいかがでしょうか。
また、EJBからSQLを発行しているのであれば、そのSQLを直接DBに発行し、結果が常にコード値の昇順で取得できるかを
確認してみるのも良いと思います。
-
2. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa Apr 9, 2012 9:54 PM (in response to t-minami)Minami Takayuki様
返信ありがとうございます。
EJBからどのようにDB検索を行っているかはご質問内容からは読み取れませんでしたが、まずはArrayListにaddしている値をデバッガやログ等で
表示するなどして、正しい順序で取得できているかどうかを確認してみてはいかがでしょうか。
また、EJBからSQLを発行しているのであれば、そのSQLを直接DBに発行し、結果が常にコード値の昇順で取得できるかを
確認してみるのも良いと思います。
上記の方法で早速検証してみたいと思います。
ありがとうございます。
結果がわかり次第、当ディスカッションに再度報告させていただきます。
-
3. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa Apr 24, 2012 12:02 AM (in response to takuyaaa)上記の件を調査し、新たに詳細が判明致しましたので、現状を整理し追記いたします。
【事象】
EJBオブジェクトの処理にてエンティティーBeanでデータベースから検索した内容を、
ArrayListに詰め込んで呼び出し側のBeanに返却する時点で、戻されたArrayListの
並び順が、エンティティーBeanが追加した順ではなく、ランダムな並び順になって
返却される。
返却された値を最終的にそのままJSPのドロップダウンリストに表示している為、
その表示が異常な並び順になってしまう。
処理の流れについては、以下の通りとなります。Step1.JSP側からEJBを呼び出し、その中でリスト取得用Bean.javaからエンティティーBean.javaの検索メソッドを呼び出す。
Step2.Step1により、エンティティーBean.java内で、データベースに対して検索処理を行う。
Step3.データベースの検索結果を件数分繰り返し、取得した値をArrayListに対して順にaddしていく。
Step4.Step3で取得したArrayListを呼び出し元のリスト取得用Beanに返却する。
Step5.返却された中身を、JSP側で表示させる。
上記の通りの仕組みのプログラムを実行したところ、Step4で取得できたArrayListの中身を確認すると、Step3でaddした並び順と
一致せず、ランダムな並びでセットされて結果が返却されました。検証のため、Step3でaddしたArrayListの内容をデバッグ出力させて中身を確認すると、addした順に正しく並んでいました。
Step4でも同様にデバッグ出力させて中身を確認すると、順序がランダムになっていました。結論的に、リスト取得用Bean.javaがエンティティーBean.javaから返却値を受け取る際に、並び順が異常になっているのではないか
と考えています。このような事象は考えうるでしょうか。基本的に、ArrayListは、addした順序は保持されるはずと考えておりますが・・。
また、ご存知であれば、原因及び対策を教えていただけないでしょうか。
宜しくお願いします。補足事項として、
返却に使ったリストクラスでArrayList以外でも試してみましたが、結果は変わりませんでした。
LinkedList
CopyOnWriteArrayList
Collections.synchronizedList(new ArrayList()); -
4. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
t-minami Apr 25, 2012 4:00 AM (in response to takuyaaa)nakamura takuyaさん、こんにちは。
このような事象は考えうるでしょうか。基本的に、ArrayListは、addした順序は保持されるはずと考えておりますが・・。
また、ご存知であれば、原因及び対策を教えていただけないでしょうか。
宜しくお願いします。基本的に、ArrayListはaddした順序を保持するはずです。
残念ながら、私自身はこのようなケースに遭遇した経験はなく、申し訳ないのですが
現状の情報だけでは直接的な回答は差し上げられません。
(どなたかご存知の方いらっしゃいましたら、ご助力いただけますと幸いです)
疑いのあるポイントとしては、
1. リスト取得用Bean.javaとエンティティーBean.javaでリモートの通信を行う際のシリアライズ時に、
何かしらArrayListの順序に影響を与えるような動作が行われている
2. エンティティーBean.java内のArrayListの保持の仕方に問題がある
などが考えられます。
当方にて、お話から分かる範囲で実装したサンプルにて試験をしましたが、
servlet <-> session bean <-> entity beanで問題なくArrayListの受け渡しができているようです。
(サンプルはソースコード含めて添付しましたので、可能であればそちらの環境でも動作をご確認下さい)
あくまでサンプルですので、Entity Beanの実装方法がいい加減である点はご容赦下さい。
実行は、ブラウザなどからhttp://localhost:8080/listtest_war/TestArrayListServletにリクエストを投げるだけです。
標準出力にArrayListに詰めた要素を出力します。
動作させた端末はWindowsXP SP3環境です。
その他の環境情報と実行時のログは添付ファイル内にあります。
このような簡単なサンプルを足がかりとして、もう少し事象が発生するケースを切り分けていただければ
何か分かるかも知れません。
-
arraylisttest.zip 11.0 KB
-
-
5. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa Apr 27, 2012 1:19 AM (in response to t-minami)Minami Takayuki様
返信ありがとうございます。
また、サンプルまで添付いただき、まことに恐縮です。早速なのですが、ご報告としまして
サンプルを動作させてみて、確かに、並び順は変わることなく処理されるということを確認することができました。移行を行おうとしている資産の並び順がおかしくなる現象については、色々ソールから調査をしておりますが、
具体的にどのあたりが問題の原因となっているのかの個所について、さらに調べを進めています。1つ分かったことがありまして、
前回お伝えした現象の生じるまでのステップで、
|Step4.Step3で取得したArrayListを呼び出し元のリスト取得用Beanに返却する。
この時点でEntityBean側で、getClass().getName()させてみると、java.util.ArrayListと表示されます。
(当然ArrayListを配列としているため)が、SessionBeanに、その値が戻った時点で、再度getClass().getName()させてみると、なんと、型が
java.util.HashSetと表示されることが分かりました。御存じの通り、HashSetクラスは、順序が維持されない種類のクラスになるので、順序が狂うという理屈は
確かに納得できますが、元々ArrayListで作られた配列が、いきなりHashSetに変わってしまうという事象
というのが生じるものなのかは、全く不明です。頂いたサンプルも、試してみました。
EntityBeanで、ArrayListを作っているところをHashSetに変えたところ、同じような動きをしました。
が、これは、HashSetがそういうクラスなので、発生する現象は、仕様通りといえますので、当事象とは別の話
と考えます。頂いた御指摘の中で、
|1. リスト取得用Bean.javaとエンティティーBean.javaでリモートの通信を行う際のシリアライズ時に、
|何かしらArrayListの順序に影響を与えるような動作が行われている
|2. エンティティーBean.java内のArrayListの保持の仕方に問題があるシリアライズされて通信されるということでしたが、EJBのメソッド呼び出し間で内部的に
配列の構造が変化してしまうような動きをしている個所があるのかとも思いましたが、
やはり実装上なにか問題があって、おかしくなっているのではないかといったところです。あと、2.に絡む件かどうかですが、
頂いたサンプルですと、Listのインターフェイスを実装されておりましたが、こちらの資産では、
すべてCollectionでインターフェイスととっております。EntityBeanからの受け取りは、
Collection collection = bean.getDBResultList();
という感じで取り出しております。現状
EJBメソッドを、Collectionインターフェイス経由でArrayListを保持させた内容を受け取ると、
HashSetで帰ってくるという状況です。
JBoss内部で何か起きているのでしょうか・・・。
-
6. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
t-minami Apr 27, 2012 3:52 AM (in response to takuyaaa)nakamura takuyaさん、こんにちは。
この時点でEntityBean側で、getClass().getName()させてみると、java.util.ArrayListと表示されます。
(当然ArrayListを配列としているため)が、SessionBeanに、その値が戻った時点で、再度getClass().getName()させてみると、なんと、型が
java.util.HashSetと表示されることが分かりました。御存じの通り、HashSetクラスは、順序が維持されない種類のクラスになるので、順序が狂うという理屈は
確かに納得できますが、元々ArrayListで作られた配列が、いきなりHashSetに変わってしまうという事象
というのが生じるものなのかは、全く不明です。まずは一歩前進だと思います。少なくともArrayListの順序が入れ替わっているのではなく、
HashSetに変換されていることが問題である、ということが分かりました。
HashSetに変わっているのだとすれば、プログラム的に変換が加えられているという可能性が最も高いでしょう。
どのプログラムが変換を加えているのかということは現時点では何とも言えませんが。
|1. リスト取得用Bean.javaとエンティティーBean.javaでリモートの通信を行う際のシリアライズ時に、
|何かしらArrayListの順序に影響を与えるような動作が行われている
|2. エンティティーBean.java内のArrayListの保持の仕方に問題があるシリアライズされて通信されるということでしたが、EJBのメソッド呼び出し間で内部的に
配列の構造が変化してしまうような動きをしている個所があるのかとも思いましたが、
やはり実装上なにか問題があって、おかしくなっているのではないかといったところです。こちらはおっしゃる通り、通信時の問題ではないと思います。
シリアライズ、デシリアライズでインスタンスが変わることは考えにくいので、
1の可能性はひとまず忘れて良いと思います。
|2. エンティティーBean.java内のArrayListの保持の仕方に問題がある
あと、2.に絡む件かどうかですが、
頂いたサンプルですと、Listのインターフェイスを実装されておりましたが、こちらの資産では、
すべてCollectionでインターフェイスととっております。一応こちらでも、Listインタフェースの部分を全てCollectionインタフェースに変更して
再度サンプルを実行してみましたが、問題なくArrayListで取得できております。
Collectionインタフェースのiterator()メソッドの仕様にも
「コレクションの要素の反復子を返します。要素が返される順序についての保証はありません。
ただし、このコレクションが、保証を提供するクラスのインスタンスである場合は例外です。」
と記載されておりますので、インスタンスがArrayListであれば、Collectionインタフェースから
Iteratorを取得するという実装にも動作上問題は無いかと思います。
http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Collection.html#iterator()
現状
EJBメソッドを、Collectionインターフェイス経由でArrayListを保持させた内容を受け取ると、
HashSetで帰ってくるという状況です。
JBoss内部で何か起きているのでしょうか・・・。
サンプル実装をそちらの環境で実行して頂いた時に、特に問題なく動作するということですので、
現状JBossの動作を疑ってかかるのは後回しにした方が良いと思います。
(現時点では可能性が低い上、調べ出すと一番時間がかかる観点だと思いますので)
こちらで現象が再現しないので、以下に私ならどうするか、というポイントを記載させていただきます。
調査のヒントになれば幸いです。
1. 本当にJBossとWebLogicの動作の差異であるか確認する
・WebLogicとJBossを動作させているマシンのH/W、OS環境は同じか?
・WebLogicとJBossが動作しているJDKのバージョンは同じか?
(java -versionで表示されるバージョンが一緒でも、環境変数の設定ミスで違うJDKで実行していないか)
2. 共通処理、フレームワークなどが影響していないか
・WebLogic環境では、SessionBeanで取得できるインスタンスはArrayListであるか?
(WebLogic環境でもHashSetになっていた可能性は無いか)
・ユーザアプリケーション以外の共通フレームワークなどのバージョンを更新していないか?
・共通処理やアプリケーションでnew HashSet()をコールしている箇所を全検索
Collection a = new ArrayList();
Collection b = new HashSet(a);
上記のような処理をすると変換が行われてしまうので、このような処理が存在しないか確認。
3. リファクタリングや移行時に置換ミス等は無かったか
・ソースや設定ファイルを一括置換した場合などに定義が誤って書き換わっており、
SessionBeanから意図しないEntityBeanが呼び出されていないか。
(ArrayListに入っている内容と、SessionBeanで取得したHashSetの内容・要素数が本当に一致しているか
確認してみるのも良いと思います)
ここまで調査して問題が無いのであれば、デバッガなどを使って、ArrayListがSessionBeanに
返却される箇所の処理を追跡すると良いでしょう。
-
7. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa Apr 30, 2012 9:27 PM (in response to t-minami)Minami Takayuki さん。
こんにちは。
いろいろなご指摘、恐れ入ります。
確認の結果を下記にインラインにて書き出させていただきます。> 1. 本当にJBossとWebLogicの動作の差異であるか確認する
> ・WebLogicとJBossを動作させているマシンのH/W、OS環境は同じか?これについては、
同じマシン、同じOSになります。
> ・WebLogicとJBossが動作しているJDKのバージョンは同じか?
基本的に、WebLogic環境と同一マシンにてJBoss移行作業をしているため
JDKのバージョンは一致しております。> (java -versionで表示されるバージョンが一緒でも、環境変数の設定ミスで違うJDKで実行していないか)
WebLogicのログにも導入しております、JDK7のバージョン表記(1.7.0_02)が出ていますので、間違いないと思います。
> 2. 共通処理、フレームワークなどが影響していないか
>
> ・WebLogic環境では、SessionBeanで取得できるインスタンスはArrayListであるか?
> (WebLogic環境でもHashSetになっていた可能性は無いか)確認しました。WebLogic環境にて、同じモジュールを動作させデバッグ出力させましたところ、
ArrayListと表示されましたので、型のずれは起きていないように思えます。> ・ユーザアプリケーション以外の共通フレームワークなどのバージョンを更新していないか?
> ・共通処理やアプリケーションでnew HashSet()をコールしている箇所を全検索
> Collection a = new ArrayList();
> Collection b = new HashSet(a);
> 上記のような処理をすると変換が行われてしまうので、このような処理が存在しないか確認。全ソースコードを総なめしてみましたが、HashSetを取り扱っているコードは発見できません。
> 3. リファクタリングや移行時に置換ミス等は無かったか
> ・ソースや設定ファイルを一括置換した場合などに定義が誤って書き換わっており、
> SessionBeanから意図しないEntityBeanが呼び出されていないか。
> (ArrayListに入っている内容と、SessionBeanで取得したHashSetの内容・要素数が本当に一致しているか
> 確認してみるのも良いと思います)今回の移行では、資産は
Javaのコードについては、変更は基本的に行っておらず、
DD(ejb-jar.xml)の書き換え(グローバルJNDIに変わったことで修正しなくてはならない記述があった)
が主たる移行の作業となっておりますので、一括置換するような改修作業は実施しておりません。といった状況になりますので、やはりSessionBeanの廻りをもう少し調査する必要がありそうです。
取り急ぎご連絡です。
-
8. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa May 1, 2012 4:56 AM (in response to takuyaaa)
続報です。意図的に、例外を発生させ、スタックトレースを取得し、呼び出し階層情報を一気に取り出してみました。
その結果、呼び出し元と呼び出し先との間には、JBossのEJB関連のモジュールを相当通過してから
返却されているのがわかります。2012-05-01 15:47:01,994 - 当メソッドの呼び出し元(0) = ClassName:jp.Test.TestEntityBean,MethodName:ejbFindList,Line:61
2012-05-01 15:47:02,000 - 当メソッドの呼び出し元(1) = ClassName:sun.reflect.NativeMethodAccessorImpl,MethodName:invoke0,Line:-2
2012-05-01 15:47:02,001 - 当メソッドの呼び出し元(2) = ClassName:sun.reflect.NativeMethodAccessorImpl,MethodName:invoke,Line:57
2012-05-01 15:47:02,001 - 当メソッドの呼び出し元(3) = ClassName:sun.reflect.DelegatingMethodAccessorImpl,MethodName:invoke,Line:43
2012-05-01 15:47:02,001 - 当メソッドの呼び出し元(4) = ClassName:java.lang.reflect.Method,MethodName:invoke,Line:601
2012-05-01 15:47:02,001 - 当メソッドの呼び出し元(5) = ClassName:org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor,MethodName:processInvocation,Line:72
2012-05-01 15:47:02,002 - 当メソッドの呼び出し元(6) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,002 - 当メソッドの呼び出し元(7) = ClassName:org.jboss.invocation.WeavedInterceptor,MethodName:processInvocation,Line:53
2012-05-01 15:47:02,002 - 当メソッドの呼び出し元(8) = ClassName:org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1,MethodName:processInvocation,Line:36
2012-05-01 15:47:02,002 - 当メソッドの呼び出し元(9) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,003 - 当メソッドの呼び出し元(10) = ClassName:org.jboss.as.ejb3.component.entity.interceptors.EntityBeanReentrancyInterceptor,MethodName:processInvocation,Line:50
2012-05-01 15:47:02,003 - 当メソッドの呼び出し元(11) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,003 - 当メソッドの呼び出し元(12) = ClassName:org.jboss.as.ejb3.component.entity.interceptors.EntityBeanSynchronizationInterceptor,MethodName:processInvocation,Line:68
2012-05-01 15:47:02,003 - 当メソッドの呼び出し元(13) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,004 - 当メソッドの呼び出し元(14) = ClassName:org.jboss.invocation.InitialInterceptor,MethodName:processInvocation,Line:21
2012-05-01 15:47:02,004 - 当メソッドの呼び出し元(15) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,005 - 当メソッドの呼び出し元(16) = ClassName:org.jboss.invocation.ChainedInterceptor,MethodName:processInvocation,Line:61
2012-05-01 15:47:02,005 - 当メソッドの呼び出し元(17) = ClassName:org.jboss.as.ejb3.component.entity.interceptors.EntityBeanHomeFinderInterceptorFactory,MethodName:invokeFind,Line:153
2012-05-01 15:47:02,005 - 当メソッドの呼び出し元(18) = ClassName:org.jboss.as.ejb3.component.entity.interceptors.EntityBeanHomeFinderInterceptorFactory$1,MethodName:processInvocation,Line:92
2012-05-01 15:47:02,005 - 当メソッドの呼び出し元(19) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,006 - 当メソッドの呼び出し元(20) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:invokeInCallerTx,Line:202
2012-05-01 15:47:02,006 - 当メソッドの呼び出し元(21) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:required,Line:306
2012-05-01 15:47:02,006 - 当メソッドの呼び出し元(22) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:processInvocation,Line:190
2012-05-01 15:47:02,006 - 当メソッドの呼び出し元(23) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,007 - 当メソッドの呼び出し元(24) = ClassName:org.jboss.as.ejb3.remote.EJBRemoteTransactionPropogatingInterceptor,MethodName:processInvocation,Line:80
2012-05-01 15:47:02,007 - 当メソッドの呼び出し元(25) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,007 - 当メソッドの呼び出し元(26) = ClassName:org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor,MethodName:processInvocation,Line:41
2012-05-01 15:47:02,007 - 当メソッドの呼び出し元(27) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,008 - 当メソッドの呼び出し元(28) = ClassName:org.jboss.as.ejb3.component.interceptors.LoggingInterceptor,MethodName:processInvocation,Line:59
2012-05-01 15:47:02,008 - 当メソッドの呼び出し元(29) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,009 - 当メソッドの呼び出し元(30) = ClassName:org.jboss.as.ejb3.component.interceptors.EjbExceptionTransformingInterceptorFactories$1,MethodName:processInvocation,Line:65
2012-05-01 15:47:02,009 - 当メソッドの呼び出し元(31) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,009 - 当メソッドの呼び出し元(32) = ClassName:org.jboss.as.ee.component.NamespaceContextInterceptor,MethodName:processInvocation,Line:50
2012-05-01 15:47:02,009 - 当メソッドの呼び出し元(33) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,010 - 当メソッドの呼び出し元(34) = ClassName:org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor,MethodName:processInvocation,Line:32
2012-05-01 15:47:02,010 - 当メソッドの呼び出し元(35) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,010 - 当メソッドの呼び出し元(36) = ClassName:org.jboss.as.ee.component.TCCLInterceptor,MethodName:processInvocation,Line:45
2012-05-01 15:47:02,010 - 当メソッドの呼び出し元(37) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
2012-05-01 15:47:02,010 - 当メソッドの呼び出し元(38) = ClassName:org.jboss.invocation.ChainedInterceptor,MethodName:processInvocation,Line:61
2012-05-01 15:47:02,011 - 当メソッドの呼び出し元(39) = ClassName:org.jboss.as.ee.component.ViewService$View,MethodName:invoke,Line:165
2012-05-01 15:47:02,011 - 当メソッドの呼び出し元(40) = ClassName:org.jboss.as.ejb3.remote.LocalEjbReceiver,MethodName:processInvocation,Line:179
2012-05-01 15:47:02,011 - 当メソッドの呼び出し元(41) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:173
2012-05-01 15:47:02,011 - 当メソッドの呼び出し元(42) = ClassName:org.jboss.ejb.client.TransactionInterceptor,MethodName:handleInvocation,Line:43
2012-05-01 15:47:02,011 - 当メソッドの呼び出し元(43) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:175
2012-05-01 15:47:02,012 - 当メソッドの呼び出し元(44) = ClassName:org.jboss.ejb.client.ReceiverInterceptor,MethodName:handleInvocation,Line:92
2012-05-01 15:47:02,012 - 当メソッドの呼び出し元(45) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:175
2012-05-01 15:47:02,012 - 当メソッドの呼び出し元(46) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:doInvoke,Line:136
2012-05-01 15:47:02,012 - 当メソッドの呼び出し元(47) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:doInvoke,Line:121
2012-05-01 15:47:02,012 - 当メソッドの呼び出し元(48) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:invoke,Line:104
2012-05-01 15:47:02,013 - 当メソッドの呼び出し元(49) = ClassName:$Proxy273,MethodName:findKikanList,Line:-1
2012-05-01 15:47:02,013 - 当メソッドの呼び出し元(50) = ClassName:jp.Test.GetListBean,MethodName:getList,Line:248その中で、唯一HashSetをnewしているソースが合致しまして
EntityBeanHomeFinderInterceptorFactory
クラスなるものが、有ります。(当メソッドの呼び出し元(17)の箇所です。)
の107行目で、switch文があり、その中で、COLLECTION型かどうかを聞いている個所があり、
返却値を返すところの処理でHashSetをnewしているところがprepareResultsメソッド内にあり、スタックトレースからみると、
この処理を通過している感じです。この処理にて、返却値を生成しているのだとすると、確実にHashSetになる気がしますがその意図はわかりませんが、JBoss内部のEntity廻りのモジュールの仕様ということになってしまいますかね。
頂いたサンプルの方も、スタックトレースを取り出してみました。
TestEntityBean上に、getDBResultList()関数を呼び出す際、当該のEntityBeanHomeFinderInterceptorFactory
を通っていない事がわかります。メソッドの名前の付け方?(ejbで始まるような)等起因する点があるのでしょうか。
16:26:37,209 INFO 当メソッドの呼び出し元(0) = ClassName:test.TestEntityBean,MethodName:getDBResultList,Line:32
16:26:37,212 INFO 当メソッドの呼び出し元(1) = ClassName:sun.reflect.NativeMethodAccessorImpl,MethodName:invoke0,Line:-2
16:26:37,214 INFO 当メソッドの呼び出し元(2) = ClassName:sun.reflect.NativeMethodAccessorImpl,MethodName:invoke,Line:57
16:26:37,216 INFO 当メソッドの呼び出し元(3) = ClassName:sun.reflect.DelegatingMethodAccessorImpl,MethodName:invoke,Line:43
16:26:37,218 INFO 当メソッドの呼び出し元(4) = ClassName:java.lang.reflect.Method,MethodName:invoke,Line:601
16:26:37,220 INFO 当メソッドの呼び出し元(5) = ClassName:org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor,MethodName:processInvocation,Line:72
16:26:37,224 INFO 当メソッドの呼び出し元(6) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,226 INFO 当メソッドの呼び出し元(7) = ClassName:org.jboss.invocation.WeavedInterceptor,MethodName:processInvocation,Line:53
16:26:37,228 INFO 当メソッドの呼び出し元(8) = ClassName:org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1,MethodName:processInvocation,Line:36
16:26:37,231 INFO 当メソッドの呼び出し元(9) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,233 INFO 当メソッドの呼び出し元(10) = ClassName:org.jboss.as.ejb3.component.entity.interceptors.EntityBeanReentrancyInterceptor,MethodName:processInvocation,Line:50
16:26:37,236 INFO 当メソッドの呼び出し元(11) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,239 INFO 当メソッドの呼び出し元(12) = ClassName:org.jboss.as.ejb3.component.entity.interceptors.EntityBeanSynchronizationInterceptor,MethodName:processInvocation,Line:117
16:26:37,242 INFO 当メソッドの呼び出し元(13) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,244 INFO 当メソッドの呼び出し元(14) = ClassName:org.jboss.invocation.InitialInterceptor,MethodName:processInvocation,Line:21
16:26:37,246 INFO 当メソッドの呼び出し元(15) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,249 INFO 当メソッドの呼び出し元(16) = ClassName:org.jboss.invocation.ChainedInterceptor,MethodName:processInvocation,Line:61
16:26:37,251 INFO 当メソッドの呼び出し元(17) = ClassName:org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor,MethodName:processInvocation,Line:53
16:26:37,254 INFO 当メソッドの呼び出し元(18) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,256 INFO 当メソッドの呼び出し元(19) = ClassName:org.jboss.as.ejb3.component.entity.interceptors.EntityBeanAssociatingInterceptorFactory$1,MethodName:processInvocation,Line:87
16:26:37,260 INFO 当メソッドの呼び出し元(20) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,262 INFO 当メソッドの呼び出し元(21) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:invokeInCallerTx,Line:202
16:26:37,264 INFO 当メソッドの呼び出し元(22) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:required,Line:306
16:26:37,267 INFO 当メソッドの呼び出し元(23) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:processInvocation,Line:190
16:26:37,269 INFO 当メソッドの呼び出し元(24) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,271 INFO 当メソッドの呼び出し元(25) = ClassName:org.jboss.as.ejb3.remote.EJBRemoteTransactionPropogatingInterceptor,MethodName:processInvocation,Line:80
16:26:37,274 INFO 当メソッドの呼び出し元(26) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,276 INFO 当メソッドの呼び出し元(27) = ClassName:org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor,MethodName:processInvocation,Line:41
16:26:37,279 INFO 当メソッドの呼び出し元(28) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,282 INFO 当メソッドの呼び出し元(29) = ClassName:org.jboss.as.ejb3.component.interceptors.LoggingInterceptor,MethodName:processInvocation,Line:59
16:26:37,284 INFO 当メソッドの呼び出し元(30) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,287 INFO 当メソッドの呼び出し元(31) = ClassName:org.jboss.as.ejb3.component.interceptors.EjbExceptionTransformingInterceptorFactories$1,MethodName:processInvocation,Line:65
16:26:37,290 INFO 当メソッドの呼び出し元(32) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,292 INFO 当メソッドの呼び出し元(33) = ClassName:org.jboss.as.ee.component.NamespaceContextInterceptor,MethodName:processInvocation,Line:50
16:26:37,295 INFO 当メソッドの呼び出し元(34) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,297 INFO 当メソッドの呼び出し元(35) = ClassName:org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor,MethodName:processInvocation,Line:32
16:26:37,300 INFO 当メソッドの呼び出し元(36) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,302 INFO 当メソッドの呼び出し元(37) = ClassName:org.jboss.as.ee.component.TCCLInterceptor,MethodName:processInvocation,Line:45
16:26:37,306 INFO 当メソッドの呼び出し元(38) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,308 INFO 当メソッドの呼び出し元(39) = ClassName:org.jboss.invocation.ChainedInterceptor,MethodName:processInvocation,Line:61
16:26:37,310 INFO 当メソッドの呼び出し元(40) = ClassName:org.jboss.as.ee.component.ViewService$View,MethodName:invoke,Line:165
16:26:37,313 INFO 当メソッドの呼び出し元(41) = ClassName:org.jboss.as.ejb3.remote.LocalEjbReceiver,MethodName:processInvocation,Line:179
16:26:37,315 INFO 当メソッドの呼び出し元(42) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:173
16:26:37,318 INFO 当メソッドの呼び出し元(43) = ClassName:org.jboss.ejb.client.TransactionInterceptor,MethodName:handleInvocation,Line:43
16:26:37,320 INFO 当メソッドの呼び出し元(44) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:175
16:26:37,323 INFO 当メソッドの呼び出し元(45) = ClassName:org.jboss.ejb.client.ReceiverInterceptor,MethodName:handleInvocation,Line:92
16:26:37,325 INFO 当メソッドの呼び出し元(46) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:175
16:26:37,328 INFO 当メソッドの呼び出し元(47) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:doInvoke,Line:136
16:26:37,330 INFO 当メソッドの呼び出し元(48) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:doInvoke,Line:121
16:26:37,332 INFO 当メソッドの呼び出し元(49) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:invoke,Line:104
16:26:37,335 INFO 当メソッドの呼び出し元(50) = ClassName:$Proxy285,MethodName:getDBResultList,Line:-1
16:26:37,337 INFO 当メソッドの呼び出し元(51) = ClassName:test.GetListBean,MethodName:getList,Line:30
16:26:37,339 INFO 当メソッドの呼び出し元(52) = ClassName:sun.reflect.NativeMethodAccessorImpl,MethodName:invoke0,Line:-2
16:26:37,341 INFO 当メソッドの呼び出し元(53) = ClassName:sun.reflect.NativeMethodAccessorImpl,MethodName:invoke,Line:57
16:26:37,343 INFO 当メソッドの呼び出し元(54) = ClassName:sun.reflect.DelegatingMethodAccessorImpl,MethodName:invoke,Line:43
16:26:37,345 INFO 当メソッドの呼び出し元(55) = ClassName:java.lang.reflect.Method,MethodName:invoke,Line:601
16:26:37,348 INFO 当メソッドの呼び出し元(56) = ClassName:org.jboss.as.ee.component.ManagedReferenceMethodInterceptorFactory$ManagedReferenceMethodInterceptor,MethodName:processInvocation,Line:72
16:26:37,351 INFO 当メソッドの呼び出し元(57) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,354 INFO 当メソッドの呼び出し元(58) = ClassName:org.jboss.invocation.WeavedInterceptor,MethodName:processInvocation,Line:53
16:26:37,356 INFO 当メソッドの呼び出し元(59) = ClassName:org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1,MethodName:processInvocation,Line:36
16:26:37,359 INFO 当メソッドの呼び出し元(60) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,361 INFO 当メソッドの呼び出し元(61) = ClassName:org.jboss.as.jpa.interceptor.SBInvocationInterceptor,MethodName:processInvocation,Line:47
16:26:37,364 INFO 当メソッドの呼び出し元(62) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,366 INFO 当メソッドの呼び出し元(63) = ClassName:org.jboss.invocation.InitialInterceptor,MethodName:processInvocation,Line:21
16:26:37,369 INFO 当メソッドの呼び出し元(64) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,371 INFO 当メソッドの呼び出し元(65) = ClassName:org.jboss.invocation.ChainedInterceptor,MethodName:processInvocation,Line:61
16:26:37,373 INFO 当メソッドの呼び出し元(66) = ClassName:org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor,MethodName:processInvocation,Line:53
16:26:37,376 INFO 当メソッドの呼び出し元(67) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,379 INFO 当メソッドの呼び出し元(68) = ClassName:org.jboss.as.ejb3.component.pool.PooledInstanceInterceptor,MethodName:processInvocation,Line:51
16:26:37,381 INFO 当メソッドの呼び出し元(69) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,384 INFO 当メソッドの呼び出し元(70) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:invokeInOurTx,Line:228
16:26:37,386 INFO 当メソッドの呼び出し元(71) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:required,Line:304
16:26:37,388 INFO 当メソッドの呼び出し元(72) = ClassName:org.jboss.as.ejb3.tx.CMTTxInterceptor,MethodName:processInvocation,Line:190
16:26:37,391 INFO 当メソッドの呼び出し元(73) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,393 INFO 当メソッドの呼び出し元(74) = ClassName:org.jboss.as.ejb3.remote.EJBRemoteTransactionPropogatingInterceptor,MethodName:processInvocation,Line:80
16:26:37,396 INFO 当メソッドの呼び出し元(75) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,398 INFO 当メソッドの呼び出し元(76) = ClassName:org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor,MethodName:processInvocation,Line:41
16:26:37,401 INFO 当メソッドの呼び出し元(77) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,403 INFO 当メソッドの呼び出し元(78) = ClassName:org.jboss.as.ejb3.component.interceptors.LoggingInterceptor,MethodName:processInvocation,Line:59
16:26:37,407 INFO 当メソッドの呼び出し元(79) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,409 INFO 当メソッドの呼び出し元(80) = ClassName:org.jboss.as.ejb3.component.interceptors.EjbExceptionTransformingInterceptorFactories$1,MethodName:processInvocation,Line:65
16:26:37,412 INFO 当メソッドの呼び出し元(81) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,415 INFO 当メソッドの呼び出し元(82) = ClassName:org.jboss.as.ee.component.NamespaceContextInterceptor,MethodName:processInvocation,Line:50
16:26:37,417 INFO 当メソッドの呼び出し元(83) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,419 INFO 当メソッドの呼び出し元(84) = ClassName:org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor,MethodName:processInvocation,Line:32
16:26:37,422 INFO 当メソッドの呼び出し元(85) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,425 INFO 当メソッドの呼び出し元(86) = ClassName:org.jboss.as.ee.component.TCCLInterceptor,MethodName:processInvocation,Line:45
16:26:37,427 INFO 当メソッドの呼び出し元(87) = ClassName:org.jboss.invocation.InterceptorContext,MethodName:proceed,Line:288
16:26:37,430 INFO 当メソッドの呼び出し元(88) = ClassName:org.jboss.invocation.ChainedInterceptor,MethodName:processInvocation,Line:61
16:26:37,432 INFO 当メソッドの呼び出し元(89) = ClassName:org.jboss.as.ee.component.ViewService$View,MethodName:invoke,Line:165
16:26:37,435 INFO 当メソッドの呼び出し元(90) = ClassName:org.jboss.as.ejb3.remote.LocalEjbReceiver,MethodName:processInvocation,Line:179
16:26:37,437 INFO 当メソッドの呼び出し元(91) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:173
16:26:37,440 INFO 当メソッドの呼び出し元(92) = ClassName:org.jboss.ejb.client.TransactionInterceptor,MethodName:handleInvocation,Line:43
16:26:37,442 INFO 当メソッドの呼び出し元(93) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:175
16:26:37,445 INFO 当メソッドの呼び出し元(94) = ClassName:org.jboss.ejb.client.ReceiverInterceptor,MethodName:handleInvocation,Line:92
16:26:37,447 INFO 当メソッドの呼び出し元(95) = ClassName:org.jboss.ejb.client.EJBClientInvocationContext,MethodName:sendRequest,Line:175
16:26:37,450 INFO 当メソッドの呼び出し元(96) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:doInvoke,Line:136
16:26:37,453 INFO 当メソッドの呼び出し元(97) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:doInvoke,Line:121
16:26:37,455 INFO 当メソッドの呼び出し元(98) = ClassName:org.jboss.ejb.client.EJBInvocationHandler,MethodName:invoke,Line:104
16:26:37,457 INFO 当メソッドの呼び出し元(99) = ClassName:$Proxy283,MethodName:getList,Line:-1
16:26:37,459 INFO 当メソッドの呼び出し元(100) = ClassName:test.TestArrayListServlet,MethodName:doGet,Line:37
16:26:37,461 INFO 当メソッドの呼び出し元(101) = ClassName:javax.servlet.http.HttpServlet,MethodName:service,Line:734
16:26:37,464 INFO 当メソッドの呼び出し元(102) = ClassName:javax.servlet.http.HttpServlet,MethodName:service,Line:847
16:26:37,466 INFO 当メソッドの呼び出し元(103) = ClassName:org.apache.catalina.core.ApplicationFilterChain,MethodName:internalDoFilter,Line:329
16:26:37,468 INFO 当メソッドの呼び出し元(104) = ClassName:org.apache.catalina.core.ApplicationFilterChain,MethodName:doFilter,Line:248
16:26:37,471 INFO 当メソッドの呼び出し元(105) = ClassName:org.apache.catalina.core.StandardWrapperValve,MethodName:invoke,Line:275
16:26:37,473 INFO 当メソッドの呼び出し元(106) = ClassName:org.apache.catalina.core.StandardContextValve,MethodName:invoke,Line:161
16:26:37,476 INFO 当メソッドの呼び出し元(107) = ClassName:org.jboss.as.web.security.SecurityContextAssociationValve,MethodName:invoke,Line:154
16:26:37,479 INFO 当メソッドの呼び出し元(108) = ClassName:org.apache.catalina.core.StandardHostValve,MethodName:invoke,Line:155
16:26:37,481 INFO 当メソッドの呼び出し元(109) = ClassName:org.apache.catalina.valves.ErrorReportValve,MethodName:invoke,Line:102
16:26:37,484 INFO 当メソッドの呼び出し元(110) = ClassName:org.apache.catalina.core.StandardEngineValve,MethodName:invoke,Line:109
16:26:37,486 INFO 当メソッドの呼び出し元(111) = ClassName:org.apache.catalina.connector.CoyoteAdapter,MethodName:service,Line:368
16:26:37,489 INFO 当メソッドの呼び出し元(112) = ClassName:org.apache.coyote.http11.Http11Processor,MethodName:process,Line:877
16:26:37,491 INFO 当メソッドの呼び出し元(113) = ClassName:org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler,MethodName:process,Line:671
16:26:37,494 INFO 当メソッドの呼び出し元(114) = ClassName:org.apache.tomcat.util.net.JIoEndpoint$Worker,MethodName:run,Line:930
16:26:37,496 INFO 当メソッドの呼び出し元(115) = ClassName:java.lang.Thread,MethodName:run,Line:722 -
9. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
t-minami May 7, 2012 5:33 AM (in response to takuyaaa)nakamura takuyaさん、詳細なスタックトレースのご提示ありがとうございます。
まず始めに、私の提示したサンプルのEntityBeanの実装方法が正しくなかったことをお詫びいたします。
下記サイトなどを参考に、少し修正したサンプルを添付しました。
www.zeroscape.org/cgi-bin/wiki/wiki.cgi?page=EJB%BA%EE%C0%AE%BC%EA%BD%E7%A5%E1%A5%E2
さて、ご提示いただいたスタックトレースで、事象が再現している方のプログラムでは、
GetListBean.getList()→findKikanList()メソッドを呼び出し、最終的にEntityBeanのejbFindList()が呼び出されているようです。
(更新した私のサンプルでは、GetListBean.getList()→findTestList()としましたが、実際のfindKikanList()メソッドの実装内容が
分からなかったため、今は単純にejbFindList()を再コールするだけ(TestEntityBeanの40行目)にしています)
このejbFindList()というメソッドは、EJB2.1のEntityBeanの定義するところの「Finderメソッド」であるようです。
http://java.sun.com/products/ejb/docs.html
「Finderメソッド」はEJBコンテナが、問合せに関連付けてそのEJBタイプ(ここではTestEntityBean)の1つ以上のインスタンスを返すためのメソッドです。
http://docs.oracle.com/cd/E18355_01/web.1013/B31852-03/undejbs.htm#623023
JBossAS7.1.0Finalでは、nakamura takuyaさんのご指摘の通り、EntityBeanHomeFinderInterceptorFactoryクラスにて、
Finderメソッドで見つかった複数のEntityBeanをHashSet型に詰めて返す動作をするようです。
ここで二つのケースが考えられますが、
1. findKikanList()メソッドはejbFindList()メソッドとは独立したビジネスメソッドであり、お互いに関係がない
2. ejbFindList()メソッドが呼び出される動作は意図通りであり、WebLogicではejbFindList()メソッドの返却値を元に処理をしていた
もし1のケースであれば、命名規則や設定等が原因で、意図しないメソッドが呼び出されている事になります。
この場合は、きちんと意図したfindKikanList()の結果が返るよう、何かしらの修正をする必要が出てくると思います。
2のケースであった場合、Finderメソッドの返却値をHashSetに詰めなおすのはJBossAS7の仕様であると思われます。
私自身、あまりEJB2.1の使用方法に明るくないため、もしかしたら別の解決方法があるのかもしれませんが、
単純に考えるなら、業務アプリケーション側で返ってきた結果を独自にソートし直すなどのロジック修正を
しなければならないと考えられます。
-
listtest_ear.ear 9.8 KB
-
-
10. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa May 8, 2012 2:19 AM (in response to t-minami)
Minami Takayuki さんコメントありがとうございます。
1点訂正です。
誤植がありました。
誤
2012-05-01 15:47:01,994 - 当メソッドの呼び出し元(0) = ClassName:jp.Test.TestEntityBean,MethodName:ejbFindList,Line:61正
2012-05-01 15:47:01,994 - 当メソッドの呼び出し元(0) = ClassName:jp.Test.TestEntityBean,MethodName:ejbFindKikanList,Line:61
|さて、ご提示いただいたスタックトレースで、事象が再現している方のプログラムでは、
|GetListBean.getList()→findKikanList()メソッドを呼び出し、最終的にEntityBeanのejbFindList()が呼び出されているようです。
|(更新した私のサンプルでは、GetListBean.getList()→findTestList()としましたが、実際のfindKikanList()メソッドの実装内容が
|分からなかったため、今は単純にejbFindList()を再コールするだけ(TestEntityBeanの40行目)にしています)ですので、最終的にejbFindListが呼ばれるという結果は実際にはなく、
GetListBean.getList()→findKikanList()メソッドを呼び出しされた結果という形になります。WebLogic(Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド10g(10.1.3.1.0))の
開発ガイドを見る限りだと、finderメソッドで複数の結果を返す場合は、Collectionを使うサンプル
が書かれていますが、おそらく既存の実装はこれを参考に作られているのかもしれませんが、http://docs.oracle.com/cd/E18355_01/web.1013/B31852-03/ent21imp.htm
御指摘の通り
|JBossAS7.1.0Finalでは、nakamura takuyaさんのご指摘の通り、EntityBeanHomeFinderInterceptorFactoryクラスにて、
|Finderメソッドで見つかった複数のEntityBeanをHashSet型に詰めて返す動作をするようです。サンプルコードありがとうございます。
早速試しました。頂いたサンプルですとfinderメソッドをコールする動きに変わっているようですが、StackTraceを採取した結果ですが、EntityBeanHomeFinderInterceptorFactoryを通るかと
思いきや、通っていない感じです。別途添付ファイルに、EJBTEST.ear.StackTrace.txtをアップロードいたします。
なので、当方の資産の既存の作り的に、ちょっと異なる点があるのかもしれません。
御指摘のケースについてですが
|1. findKikanList()メソッドはejbFindList()メソッドとは独立したビジネスメソッドであり、お互いに関係がない
については、申し訳ございません、誤植だったので、このケースは無いと思います。
|2. ejbFindList()メソッドが呼び出される動作は意図通りであり、WebLogicではejbFindList()メソッドの返却値を元に処理をしていた
結局、呼ばれるのは、ejbFindKikanListなので、処理内容はCollectionを伝えてきちんと返そうと
している動きであることは間違いは無いと思います。考察する点として
ファインダーメソッドを扱う場合、JBossの場合、結果がHashSetになってしまうのであれば
別の方法(ビジネスメソッドと呼ぶのでしょうか)にしてみて、検証等を行ったらどうなるか?というのを
試してみようかと思います。ちなみに、現時点で、暫定対応的ではありますが、HashSetになって受け取った側で、自前で並べ替え処理を
コレクションに対して行って、無理矢理並べ換えを(今回は、コード順にした)行う処理を実装して事態を回避しております。取り急ぎ、現状のご報告は以上です。
-
11. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
t-minami May 8, 2012 3:22 AM (in response to takuyaaa)きむらさん、ご指摘いただきありがとうございました。
Finderの返却値のタイプ定義はEJBの仕様によるもので、JBossAS7の仕様という書き方は間違いでした。
nakamura takuyaさん
サンプルコードありがとうございます。
早速試しました。頂いたサンプルですとfinderメソッドをコールする動きに変わっているようですが、StackTraceを採取した結果ですが、EntityBeanHomeFinderInterceptorFactoryを通るかと
思いきや、通っていない感じです。別途添付ファイルに、EJBTEST.ear.StackTrace.txtをアップロードいたします。
なので、当方の資産の既存の作り的に、ちょっと異なる点があるのかもしれません。
スタックトレースのご提示ありがとうございます。
最終的に呼び出されているメソッド名がejbFindKikanListなのであれば、動作についての疑問は無くなりました。
以下、順を追ってご説明いたします。
私が最初に提示したサンプルにおいて、SessionBeanからEntityBeanを呼び出す部分の実装方法が、
Finderメソッドを呼び出すやり方になっていませんでした。
私のサンプルでは、EntityBeanのHomeインタフェース経由ではなく、リモートインタフェース経由でメソッドを呼び出していたため、
EntityBeanHomeFinderInterceptorFactoryを通っていなかったということです。
既にご承知かもしれませんが、Finderメソッドを呼び出す際は、EntityBeanのHomeインタフェース経由で呼び出すのが正式な手順です。
(HomeインタフェースのfindList()メソッドを呼び出すと、EJBコンテナによってEntityBeanのejbFindList()が呼ばれる、という動作になります)
再度サンプルを修正し、EntityBeanで例外を発生させたところ、EntityBeanHomeFinderInterceptorFactoryを通過していることが確認できました。
修正したサンプルと動作時のスタックトレースを添付しましたのでご確認下さい。
混乱させてしまい、すみませんでした。
-
listtest_ear.zip 10.9 KB
-
-
12. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa May 8, 2012 4:22 AM (in response to t-minami)Minami Takayuki 様
お世話になっております。
再度サンプルを修正し、EntityBeanで例外を発生させたところ、EntityBeanHomeFinderInterceptorFactoryを通過していることが確認できました。
修正したサンプルと動作時のスタックトレースを添付しましたのでご確認下さい。
Minami Takayuki様に頂きました添付のearをもとに、例外部分を取り除いたところ、ご指摘通りの挙動になりました。
ご報告までに、並び順対応したログを添付させていただきます。
-
並び順対応ログ.txt.zip 1.4 KB
-
-
13. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
takuyaaa May 8, 2012 7:16 AM (in response to t-minami)続報です。
finderメソッド以外の方法を模索していて、
EJB2.1の場合、selectメソッドとかhomeメソッドとか実装できると知り
WebLogicの開発ガイドのサイトを参考に、selectメソッドを実装する方法のところを見て
このメソッドでも、Collectionも返すことが出来るとあったので、早速サンプルで検証を行ってみました。
以下のselectメソッドについての章を参考に実装しましたが、
http://docs.oracle.com/cd/E18355_01/web.1013/B31852-03/undejbs.htm#623967デプロイ出来ずエラーになってしまいます。
TestEntityHome.java
TestEntityBean.java
の2つに、追加でselectメソッドを作りました。
そして、EARを作成し
JBAS014337: Could not resolve corresponding ejbHome for home interface method public abstract java.util.Collection test.TestEntityHome.selectList() throws javax.ejb.FinderException on EJB TestEntity
というエラーです。
もしかして、JBossでは、finderメソッドしかサポートしていない??デプロイ結果は以下の通りです。
20:03:51,887 INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) JBAS015876: Starting deployment of "EJBTEST.ear"
20:03:51,935 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015876: Starting deployment of "EJBTestWeb.war"
20:03:51,935 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015876: Starting deployment of "EJB.jar"
20:03:51,950 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named TestEntity in deployment unit subdeployment "EJB.jar" of deployment "EJBTEST.ear" are as follows:java:global/EJBTEST/EJB/TestEntity!test.TestEntity
java:app/EJB/TestEntity!test.TestEntity
java:module/TestEntity!test.TestEntity
java:jboss/exported/EJBTEST/EJB/TestEntity!test.TestEntity
java:global/EJBTEST/EJB/TestEntity!test.TestEntityHome
java:app/EJB/TestEntity!test.TestEntityHome
java:module/TestEntity!test.TestEntityHome
java:jboss/exported/EJBTEST/EJB/TestEntity!test.TestEntityHome20:03:51,966 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named GetListBean in deployment unit subdeployment "EJB.jar" of deployment "EJBTEST.ear" are as follows:
java:global/EJBTEST/EJB/GetListBean!test.GetList
java:app/EJB/GetListBean!test.GetList
java:module/GetListBean!test.GetList
java:jboss/exported/EJBTEST/EJB/GetListBean!test.GetList
java:global/EJBTEST/EJB/GetListBean!test.GetListHome
java:app/EJB/GetListBean!test.GetListHome
java:module/GetListBean!test.GetListHome
java:jboss/exported/EJBTEST/EJB/GetListBean!test.GetListHome20:03:51,997 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-3) MSC00001: Failed to start service jboss.deployment.subunit."EJBTEST.ear"."EJB.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.subunit."EJBTEST.ear"."EJB.jar".INSTALL: Failed to process phase INSTALL of subdeployment "EJB.jar" of deployment "EJBTEST.ear"
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:119) [jboss-as-server-7.1.0.Final.jar:7.1.0.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [rt.jar:1.7.0_02-ea]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [rt.jar:1.7.0_02-ea]
at java.lang.Thread.run(Thread.java:722) [rt.jar:1.7.0_02-ea]
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS011030: Could not configure component TestEntity
at org.jboss.as.ee.component.deployers.EEModuleConfigurationProcessor.deploy(EEModuleConfigurationProcessor.java:92)
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:113) [jboss-as-server-7.1.0.Final.jar:7.1.0.Final]
... 5 more
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: JBAS014337: Could not resolve corresponding ejbHome for home interface method public abstract java.util.Collection test.TestEntityHome.selectList() throws javax.ejb.FinderException on EJB TestEntity
at org.jboss.as.ejb3.component.entity.EntityBeanHomeViewConfigurator.resolveEjbHomeBusinessMethod(EntityBeanHomeViewConfigurator.java:205)
at org.jboss.as.ejb3.component.entity.EntityBeanHomeViewConfigurator.configure(EntityBeanHomeViewConfigurator.java:152)
at org.jboss.as.ee.component.ComponentDescription$DefaultComponentConfigurator.configure(ComponentDescription.java:921)
at org.jboss.as.ee.component.deployers.EEModuleConfigurationProcessor.deploy(EEModuleConfigurationProcessor.java:81)
... 6 more20:03:52,013 INFO [org.jboss.web] (MSC service thread 1-2) JBAS018210: Registering web context: /listtest_war
20:03:52,231 INFO [org.jboss.as.server] (DeploymentScanner-threads - 1) JBAS015870: Deploy of deployment "EJBTEST.ear" was rolled back with failure message {"JBAS014671: Failed services" => {"jboss.deployment.subunit.\"EJBTEST.ear\".\"EJB.jar\".INSTALL" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"EJBTEST.ear\".\"EJB.jar\".INSTALL: Failed to process phase INSTALL of subdeployment \"EJB.jar\" of deployment \"EJBTEST.ear\""},"JBAS014771: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ORBjboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ORBjboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ORBjboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ORBjboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]","jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]","jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]"]}
20:03:52,231 INFO [org.jboss.as.server.deployment] (MSC service thread 1-4) JBAS015877: Stopped deployment EJB.jar in 13ms
20:03:52,231 INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) JBAS015877: Stopped deployment EJBTestWeb.war in 13ms
20:03:52,247 INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) JBAS015877: Stopped deployment EJBTEST.ear in 15ms
20:03:52,247 INFO [org.jboss.as.controller] (DeploymentScanner-threads - 1) JBAS014774: Service status report
JBAS014777: Services which failed to start: service jboss.deployment.subunit."EJBTEST.ear"."EJB.jar".INSTALL: org.jboss.msc.service.StartException in service jboss.deployment.subunit."EJBTEST.ear"."EJB.jar".INSTALL: Failed to process phase INSTALL of subdeployment "EJB.jar" of deployment "EJBTEST.ear"20:03:52,247 ERROR [org.jboss.as.server.deployment.scanner] (DeploymentScanner-threads - 2) {"JBAS014653: Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"JBAS014671: Failed services" => {"jboss.deployment.subunit.\"EJBTEST.ear\".\"EJB.jar\".INSTALL" => "org.jboss.msc.service.StartException in service jboss.deployment.subunit.\"EJBTEST.ear\".\"EJB.jar\".INSTALL: Failed to process phase INSTALL of subdeployment \"EJB.jar\" of deployment \"EJBTEST.ear\""},"JBAS014771: Services with missing/unavailable dependencies" => ["jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ORBjboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ORBjboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ORBjboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ORBjboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.TestEntityMissing[jboss.naming.context.java.comp.EJBTEST.EJB.TestEntity.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.TestEntity]","jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.HandleDelegatejboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]","jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.Validatorjboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]","jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.GetListBeanMissing[jboss.naming.context.java.comp.EJBTEST.EJB.GetListBean.ValidatorFactoryjboss.naming.context.java.comp.EJBTEST.EJB.GetListBean]"]}}}
-
EJBTEST.ear 10.7 KB
-
-
14. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
t-minami May 10, 2012 2:34 AM (in response to takuyaaa)nakamura takuyaさんこんにちは。
JBAS014337: Could not resolve corresponding ejbHome for home interface method public abstract java.util.Collection test.TestEntityHome.selectList() throws javax.ejb.FinderException on EJB TestEntity
というエラーです。
もしかして、JBossでは、finderメソッドしかサポートしていない??JBossAS7がサポートする仕様は以下に一覧があります。
JBoss7.1.0Finalは「Certified Java EE 6 Full Profile」ですので、EJBの仕様に書いてあることをサポートしていないことはないでしょう。
さて、上記のエラーメッセージを直訳すると
「Homeインタフェース上のメソッドTestEntityHome.selectList()に対応するejbHomeメソッドが見つかりません」
という意味になるかと思います。
http://java.sun.com/products/ejb/docs.html
EJB2.1の仕様の「9.5 Entity Bean’s Remote Home Interface」を読むと、Homeインタフェースに定義するメソッドは
createメソッド、finderメソッド、homeメソッドと読み取れます。
また「9.5.4 Home Methods」には、homeメソッドの命名条件として「名前がcreate, find, removeで始まらないメソッド名」
と記載してあります。
つまり、今回nakamura takuyaさんがselectメソッドを想定してTestEntityHome.javaに定義したselectList()メソッドを
EJBコンテナがhomeメソッドだと解釈してしまったため、上記のエラーになったと思われます。
selectメソッドの実装方法について、もう少し詳細に調べてみてはいかがでしょうか。