Uploaded image for project: 'S2Dao'
  1. S2Dao
  2. DAO-143

Java の実装によっては @ProcedureCall で @ProcedureParameter の定義順に引数セットされない問題に対処しました。

XMLWordPrintable

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Major Major
    • 1.0.49
    • Affects Version/s: None
    • Component/s: s2dao
    • None
    • Environment:
      IBM WebSphere 5.1 (SuSE linux) (java 1.4 IBM実装)

      org.seasar.dao.impl.ProcedureMetaDataFactory 内の
      java.lang.Class#getDeclaredFields()
      によって、@ ProcedureParameter の
      定義順に Field[配列] が返ってくることを想定した作りとなっていますが、
      Java API の Javadoc によると 特定の順序になっていることは保証されない ようです。

      参照
      http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/Class.html#getDeclaredFields()
      http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/Class.html#getDeclaredFields()

      返された配列内の要素は、ソートされていたり、特定の順序になっていることはありません。

      例えば、

      XxxDto.java
      public static class XxxDto {
        public static String a_PROCEDURE_PARAMETER = "return";
        public static String c_PROCEDURE_PARAMETER = "inout";
        public static String b_PROCEDURE_PARAMETER = "in";
      
        private double a;
        private double c;
        private double b;
        //...
      }
      

      のような定義を行った場合、
      Sun 謹製の java 上で動作させると

      a
      c
      b
      

      の順で Field[配列] が返ってきて、期待通り動作します。
      しかし、
      IBM WebSphere 5.1 (SuSE linux) (java 1.4 IBM実装)にて動作させると、

      b
      c
      a
      

      のように定義とは逆順に値が返ってくるため、引数が正しくプロシージャにセットされず、実行エラーとなってしまいます。
      IBM実装の Java では定義の逆順となって返りますが、他の Java 実装でどのような挙動になるのかはわかっておりません。

      順序不定で処理しても差し支えない処理なら
      java.lang.Class#getDeclaredFields()
      の利用は問題とならないでしょうが、 決められた順序でないと絶対にダメ な処理で利用するのは避けた方が良さそうです。

      当問題における該当ソースは下記で参照できます。

      http://svn.seasar.org/browse/tags/2008-04-24/s2dao-1.0.x/s2-dao/src/main/java/org/seasar/dao/impl/ProcedureMetaDataFactoryImpl.java?root=s2dao&view=markup

      ProcedureMetaDataFactoryImpl.java
      package org.seasar.dao.impl;
      public class ProcedureMetaDataFactoryImpl implements ProcedureMetaDataFactory {
      public ProcedureMetaData createProcedureMetaData(
                  final String procedureName, final Method method) {
              final ProcedureMetaDataImpl metaData = new ProcedureMetaDataImpl(
                      procedureName);
              final Class dtoClass = getParameterType(method);
              // ...
              // Class#getDeclaredFields() は順序保証しない
              final Field[] fields = dtoClass.getDeclaredFields();
              // ...
          }
      }
      

      1年ほど前にプロシージャ引数における順序指定の話題がありましたが、再度、対応についてご検討いただけないでしょうか?
      http://ml.seasar.org/archives/seasar-s2dao-dev/2007-August/000469.html

            Assignee:
            taedium taedium
            Reporter:
            mizuo Mizuo SUHARA
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: