[DAO-143] Java の実装によっては @ProcedureCall で @ProcedureParameter の定義順に引数セットされない問題に対処しました。 Created: 2008-09-30  Updated: 2008-10-29  Resolved: 2008-10-29

Status: Resolved
Project: S2Dao
Component/s: s2dao
Affects Version/s: None
Fix Version/s: 1.0.49

Type: Bug Priority: Major
Reporter: Mizuo SUHARA Assignee: taedium
Resolution: Fixed Votes: 0
Labels: None
Environment:

IBM WebSphere 5.1 (SuSE linux) (java 1.4 IBM実装)



 Description   

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



 Comments   
Comment by taedium [ 2008-10-29 ]

対応しました。

[seasar-s2dao-dev:637] DAO-143 フィールドの並びが定義順とは限らない件
http://ml.seasar.org/archives/seasar-s2dao-dev/2008-October/000637.html

Comment by Mizuo SUHARA [ 2008-10-06 ]

定義した順に引数セットが行われ、期待通りの動作することを確認できました。
ご対応いただきありがとうございました。

次期リリース版に当修正を含めていただければ、ありがたいです。
ご面倒をおかけしますが、よろしくお願いいたします。

Comment by Mizuo SUHARA [ 2008-10-04 ]

おぉぉーーー。早速の対応ありがとうございます。感謝、感謝です。
動作確認してみます。
今、手元に環境がないので、2008-10-06(月)以降の確認となってしまいますが、確認次第、当コメント欄にてご報告いたします。

Comment by taedium [ 2008-10-04 ]

アノテーションで順序を指定できるようにするといった対応ではなく、クラスファイルに定義された並び順を使用するようにしました。

SNAPSHOTを作成しましたので確認していただけないでしょうか?このSNAPSHOTを使う際に、ソースコードを修正する必要はありません。よろしくお願いします。

http://maven.seasar.org/maven2-snapshot/org/seasar/dao/s2-dao/1.0.49-SNAPSHOT/s2-dao-1.0.49-20081003.220516-5.jar
http://maven.seasar.org/maven2-snapshot/org/seasar/dao/s2-dao-tiger/1.0.49-SNAPSHOT/s2-dao-tiger-1.0.49-20081003.220840-4.jar

Comment by Mizuo SUHARA [ 2008-10-01 ]

ありがとうございます。対応の程宜しくお願いいたします。

Comment by taedium [ 2008-10-01 ]

アノテーションで順序を指定できるように対応します。

Generated at Mon Dec 15 10:30:42 JST 2025 using Jira 10.6.1#10060001-sha1:a6461e220f274b29ced7ac9295492f2465fe5ef5.