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()
返された配列内の要素は、ソートされていたり、特定の順序になっていることはありません。
例えば、
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()
の利用は問題とならないでしょうが、 決められた順序でないと絶対にダメ な処理で利用するのは避けた方が良さそうです。
当問題における該当ソースは下記で参照できます。
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