[Seasar-user:8656] Re: [S2Dao] Bean のプロパティに基本型以外を使う方法

Nakata Kouji [E-MAIL ADDRESS DELETED]
2007年 6月 25日 (月) 18:58:09 JST


なかたです。

org.seasar.framework.beans.impl.PropertyDescImpl クラスを改造
してみました。
これで、Enum クラスに対応でき、また、DBに格納したデータが
String 以外の場合にも、その型に適合した
static valueOf メソッドを用意しておくとそのインスタンスを生成して
設定します。
#実行効率を無視して組んだので、遅いと思いますが。

  public Object convertIfNeed(Object arg) {
    if (propertyType.isPrimitive()) {
      return convertPrimitiveWrapper(arg);
    } else if (Number.class.isAssignableFrom(propertyType)) {
      return convertNumber(arg);
    } else if (java.util.Date.class.isAssignableFrom(propertyType)) {
      return convertDate(arg);
    } else if (Boolean.class.isAssignableFrom(propertyType)) {
      return BooleanConversionUtil.toBoolean(arg);
    } else if (arg instanceof String && !String.class.equals(propertyType)) {
      if (stringConstructor != null) {
        return convertWithStringConstructor(arg);
      } else {
        Method[] methods = propertyType.getMethods();
        for (int i = 0; i < methods.length; i++) {
          if (methods[i].getName().equals("valueOf")) {
            if ((methods[i].getModifiers() & Modifier.STATIC) != 0) {
              if (methods[i].getReturnType().equals(propertyType)) {
                Class[] parameterTypes = methods[i].getParameterTypes();
                if (parameterTypes.length == 1
                    && parameterTypes[0].isAssignableFrom(arg.getClass())) {
                  // 第二引数に意味はない
                  return MethodUtil.invoke(methods[i], propertyType,
new Object[]{arg});
                }
              }
            }
          }
        }
        return arg;
      }
    } else if (java.util.Calendar.class.isAssignableFrom(propertyType)) {
      return CalendarConversionUtil.toCalendar(arg);
    } else {
      Method[] methods = propertyType.getMethods();
      for (int i = 0; i < methods.length; i++) {
        if (methods[i].getName().equals("valueOf")) {
          if ((methods[i].getModifiers() & Modifier.STATIC) != 0) {
            if (methods[i].getReturnType().equals(propertyType)) {
              Class[] parameterTypes = methods[i].getParameterTypes();
              if (parameterTypes.length == 1
                  && parameterTypes[0].isAssignableFrom(arg.getClass())) {
                // 第二引数に意味はない
                return MethodUtil.invoke(methods[i], propertyType, new
Object[]{arg});
              }
            }
          }
        }
      }
    }
    return arg;
  }



Seasar-user メーリングリストの案内