1 2 Previous Next 20 Replies Latest reply: May 15, 2012 8:56 PM by nakamura takuya RSS

WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について

nakamura takuya Newbie

いつもお世話になっております。

質問させていただきます。

 

現在、WebLogic 11gからJBossAS7.1.0Finalへの移行を行っているのですが、
JBossAS7.1.0Finalに移行したことで、画面のドロップダウン項目の並び順が
変わってしまいました。


 【WebLogic 11g時】   :コード値の昇順
 【JBossAS7.1.0Final 時】:ランダム(JBossAS7.1.0Finalを再起動する度に並び順が変わる。)

 

呼び出し側(JSP)では、ドロップダウン項目をArrayListで扱っており、単純にIteratorで
取得した順にドロップダウンの選択肢に設定しているのですが、呼び出し側で取得した時点
で既にArrayListの中身の順が「コード値の昇順」となっておりません。

 

javaプログラムを確認したところ、EJBオブジェクトの中で、DB検索し、一つずつ取得し、
ドロップダウンの選択肢をArrayListにaddしているようでした。

 

そこで、WebLogic 11gとJBossAS7.1.0Finalの、ArrayListの仕様の差異が影響しているの
ではないかと考えております。
(「WebLogic 11gではArrayListはaddした順序でiterator取得することができるが、
 JBossAS7.1.0Finalではaddした順序は保持しない」などといった仕様の差異。)

心当たりのある方いらっしゃいましたら、ご教示いただけたらと思います。

よろしくお願い致します。

  • 1. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    Minami Takayuki Newbie

    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への移行で生じる、ドロップダウン項目の並び順について
    nakamura takuya Newbie

    Minami Takayuki様

     

    返信ありがとうございます。

     

     

    EJBからどのようにDB検索を行っているかはご質問内容からは読み取れませんでしたが、まずはArrayListにaddしている値をデバッガやログ等で

    表示するなどして、正しい順序で取得できているかどうかを確認してみてはいかがでしょうか。

     

    また、EJBからSQLを発行しているのであれば、そのSQLを直接DBに発行し、結果が常にコード値の昇順で取得できるかを

    確認してみるのも良いと思います。

     

    上記の方法で早速検証してみたいと思います。

    ありがとうございます。

     

    結果がわかり次第、当ディスカッションに再度報告させていただきます。

  • 3. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    nakamura takuya Newbie

    上記の件を調査し、新たに詳細が判明致しましたので、現状を整理し追記いたします。

     

     

     

     

    【事象】
    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への移行で生じる、ドロップダウン項目の並び順について
    Minami Takayuki Newbie

    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環境です。

    その他の環境情報と実行時のログは添付ファイル内にあります。

     

    このような簡単なサンプルを足がかりとして、もう少し事象が発生するケースを切り分けていただければ

    何か分かるかも知れません。

  • 5. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    nakamura takuya Newbie

    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への移行で生じる、ドロップダウン項目の並び順について
    Minami Takayuki Newbie

    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への移行で生じる、ドロップダウン項目の並び順について
    nakamura takuya Newbie

    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への移行で生じる、ドロップダウン項目の並び順について
    nakamura takuya Newbie


    続報です。

     

    意図的に、例外を発生させ、スタックトレースを取得し、呼び出し階層情報を一気に取り出してみました。
    その結果、呼び出し元と呼び出し先との間には、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廻りのモジュールの仕様ということになってしまいますかね。

     

    参考
    https://github.com/jbossas/jboss-as/blob/master/ejb3/src/main/java/org/jboss/as/ejb3/component/entity/interceptors/EntityBeanHomeFinderInterceptorFactory.java

     

    頂いたサンプルの方も、スタックトレースを取り出してみました。

    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への移行で生じる、ドロップダウン項目の並び順について
    Minami Takayuki Newbie

    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の使用方法に明るくないため、もしかしたら別の解決方法があるのかもしれませんが、

    単純に考えるなら、業務アプリケーション側で返ってきた結果を独自にソートし直すなどのロジック修正を

    しなければならないと考えられます。

  • 10. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    Takayoshi Kimura Novice

    みなみさんがだいぶ整理してくれたので、状況がわかりました。

     

    問題を一旦整理して記述します。

     

    質問者の方はEJB2 BMP EntityBeanを使っています。問題になっているのはEJBHome Finderメソッドです。BMP実装ではキーの取得時にArrayListにキーを格納してコンテナに返却していて、コンテナはこの返却されたキーのセットを元に、オブジェクトのセットを作成してアプリケーションに返却します。返却されるオブジェクトのセットはHashSetとなっています。

     

    さて、本題。

    Minami Takayuki wrote:


    Finderメソッドの返却値をHashSetに詰めなおすのはJBossAS7の仕様であると思われます。

    Finderの返却値のタイプはCollectionおよびSetのどちらか、と定義しているのはEJB仕様です。また、キーのセットとオブジェクトのセットに同じ型のオブジェクトが返却される、というような仕様はありません(EJB3仕様 10.1.9.2 Multi-Object Findersが該当する章です)。この仕様では「順序は保証されない」ことは読み取れますし、オブジェクトのセットのコンテナとしてHashSetを返却する、というのもいたって自然な選択です。

     

    もしFinderからArrayListが返ってくるであるとか、順序が保証されているはずだ、というような仕様で保証されていないようなことを期待しているのであれば、それは単にアプリケーションのバグです。WebLogicでは「たまたま動いていた」という状態か、もしくはWebLogic独自仕様のために動いていた、のどちらかでしょう。

     

    アプリケーションの修正が必要だと思います。

     

    まとめ

    • BMPのFinderで返却されたキーのセットの型がオブジェクトのセットの型と一致するという仕様はEJBには無い
    • WebLogicはたまたまなのか意図してなのかはわからないが上記の動作となる、もちろんこの動作にポータビリティは無い
  • 11. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    nakamura takuya Newbie


    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になって受け取った側で、自前で並べ替え処理を
    コレクションに対して行って、無理矢理並べ換えを(今回は、コード順にした)行う処理を実装して事態を回避しております。

     

    取り急ぎ、現状のご報告は以上です。

  • 12. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    nakamura takuya Newbie


    Takayoshi Kimura さん

     

    お世話になっております。

     

    御指摘内容ですが、

     

    |質問者の方はEJB2 BMP EntityBeanを使っています。
    |問題になっているのはEJBHome Finderメソッドです。
    |BMP実装ではキーの取得時にArrayListにキーを格納してコンテナに返却していて、コンテナはこの返却されたキーのセットを元に、オブジェクトのセットを作成してアプリケーションに返却します。
    |返却されるオブジェクトのセットはHashSetとなっています。

     

    上記のご指摘の通りです。


    |Finderメソッドの返却値をHashSetに詰めなおすのはJBossAS7の仕様であると思われます。
    |Finderの返却値のタイプはCollectionおよびSetのどちらか、と定義しているのはEJB仕様です。
    |また、キーのセットとオブジェクトのセットに同じ型のオブジェクトが返却される、というような仕様はありません(EJB3仕様 10.1.9.2 Multi-Object Findersが該当する章です)。
    |この仕様では「順序は保証されない」ことは読み取れますし、オブジェクトのセットのコンテナとしてHashSetを返却する、というのもいたって自然な選択です。

     

    Finderメソッドが適切な利用方法、EJBへの理解が足りず
    恐れながらお伺いいたしますが、

     

    例えばデータベースから問い合わせした内容を100件(例えばORDER BY コードのような感じでコード順に受け取りたいとして)
    という風に実装をしたい場合、Finderメソッドで、Collectionを利用して、受け取っても、ORDER BY の順で中身が詰まってこず、バラバラな並びになる
    という動きなるということでしょうか?

     

    |もしFinderからArrayListが返ってくるであるとか、順序が保証されているはずだ、というような仕様で保証されていないようなことを期待しているのであれば、
    |それは単にアプリケーションのバグです。WebLogicでは「たまたま動いていた」という状態か、もしくはWebLogic独自仕様のために動いていた、のどちらかでしょう。

     

    この御指摘からすると、つまり、並び順がちゃんとした内容を受け取るような処理を実装する場合は、
    Finderメソッドは利用すべきではない、ということでしょうか?

    |アプリケーションの修正が必要だと思います。

     

    はい、では修正するとなりますと、
    まず連想されますのは、Finderメソッドから、ビジネスメソッドに変えるというのが適切でしょうか?

     

    ejbFindで始まらない、たとえばgetKikanListのようなメソッドに変えるような方法をイメージしています。

     

    |まとめ

    |BMPのFinderで返却されたキーのセットの型がオブジェクトのセットの型と一致するという仕様はEJBには無い
    |WebLogicはたまたまなのか意図してなのかはわからないが上記の動作となる、もちろんこの動作にポータビリティは無い

     

    とのことですので、Finderメソッドを使っていたけれど、やはりWebLogicでは、たまたま動いていた?

  • 13. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    Takayoshi Kimura Novice

    一番ストレートな修正方法はCMPを利用することです。仕様で順序が保証されないように見えるのはBMPだけであり、CMPであればEJBQLにORDER BYがあるので、順序を保証する結果がとれるはずです。

     

    どうしてもBMPのままにしたい、という場合は取得した結果を自分で並べ替えてArrayListなどにご希望の順序で詰め替える、という処理を書けば良いでしょう。

  • 14. Re: WebLogic 11gからJBossAS7.1.0Finalへの移行で生じる、ドロップダウン項目の並び順について
    Minami Takayuki Newbie

    きむらさん、ご指摘いただきありがとうございました。

    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を通過していることが確認できました。

    修正したサンプルと動作時のスタックトレースを添付しましたのでご確認下さい。

    混乱させてしまい、すみませんでした。

1 2 Previous Next