DBUtils で アンダーバー区切りキャメルケースのマッピングするのと、enum 対応


簡単なバッチ書くのに DBUtils 使ってるんだけど、
DBUtilsJava5 に対応したのに enum に対応していなかったりしたので、
BeanProcessor を継承してゴニョゴニョしようと思ったら private なメソッドとかあって
全部書き換えになっちゃってイヤンな感じだった。


直したのは callSetter の一部と mapColumnsToProperties の一部
mapColumnsToProperties は protected だったので継承して直して OK だったんだけど、
callSetter は呼び出し元の createBean も private で、toBean toBeanList の呼び出し元まで辿って書き換えなきゃだったうえに、その中で propertyDescriptors とか private なメソッド呼んでたりしてホント糞でした。


なので、継承だけして全部のメソッドコピーして一部だけ書き換えて対応した。

callSetter

            // Don't call setter if the value object isn't the right type
            if (this.isCompatibleType(value, params[0])) {
                setter.invoke(target, new Object[] { value });
            //enum対応追加 ここから
            }else if (params[0].isEnum()) {
                @SuppressWarnings("rawtypes")
                Class clazz = Class.forName(params[0].getName());
                setter.invoke(target, Enum.valueOf(clazz, String.class.cast(value)));
            //enum対応追加 ここまで
            } else {
              throw new SQLException(
                  "Cannot set " + prop.getName() + ": incompatible types.");
            }

mapColumnsToProperties

            for (int i = 0; i < props.length; i++) {
                // キャッシュとかしたほうがいいのかなぁ……
                if (columnName.replace("_", "").equalsIgnoreCase(props[i].getName().replace("_", ""))) {
                    columnToProperty[col] = i;
                    break;
                }
            }
        }

全体


https://gist.github.com/1063194

ここまでやるんだったら自前で全部やっちゃっても良かったとか思わないようにするのも
commons 使う時の心構えとして大事ですね!!!