4

たとえば、java.util.MapのすべてのインスタンスにConverterを登録したい場合、これを行う方法はありますか?

new BeanUtilsBean().getConvertUtils().register(new MyConverter(), Map.class);

MyConverter#convert()Mapの任意のインスタンス(HashMapなど)に対してメソッドが呼び出される場所はどこですか?

この背景には、BeanUtilsを使用してデータベースからさまざまな異なるBeanを設定していることがあります。それらのプロパティの一部は特定のインターフェイスを実装する列挙型であり、それらの値を設定するにはカスタムルーチンが必要です。問題のインターフェイスのすべての実装に単一のコンバータークラスを登録したいと思っていましたが、これを行う方法が見つからなかったため、Bean内のすべてのプロパティのクラスを調べて、その場で登録する必要がありました。コンバータークラスがたまたまこのインターフェースのインスタンスである場合は、コンバータークラスを登録します。

BeanUtilsBean b = new BeanUtilsBean();
Class< ? > propertyType = pu.getPropertyType(this, setterName);

if (isImplementationOfMyInterface(propertyType)) {
    b.getConvertUtils().register(new MyConverter(), propertyType);
}

b.setProperty(this, setterName, value);

これはかなり厄介なようです、そして私はこれを行うためのより良い方法があるに違いないと確信していますか?

4

2 に答える 2

6

をオーバーライドできますConvertUtilsBean。次のコードはのサポートを追加しEnumますが、次の場合も同じことができますMap

BeanUtilsBean.setInstance(new BeanUtilsBean(new EnumAwareConvertUtilsBean()));

クラス定義:

public class EnumAwareConvertUtilsBean extends ConvertUtilsBean2 {

    private static final EnumConverter ENUM_CONVERTER = new EnumConverter();

    @Override
    public Converter lookup(Class pClazz) {
        final Converter converter = super.lookup(pClazz);

        if (converter == null && pClazz.isEnum()) {
            return ENUM_CONVERTER;
        } else {
            return converter;
        }
    }

}

public class EnumConverter extends AbstractConverter {

    private static final Logger LOGGER = LoggerFactory.getLogger(EnumConverter.class);

    @Override
    protected String convertToString(final Object pValue) throws Throwable {
        return ((Enum) pValue).name();
    }

    @Override
    protected Object convertToType(final Class pType, final Object pValue)
        throws Throwable
    {
        // NOTE: Convert to String is handled elsewhere

        final Class<? extends Enum> type = pType;
        try {
            return Enum.valueOf(type, pValue.toString());
        } catch (final IllegalArgumentException e) {
            LOGGER.warn("No enum value \""
                + pValue
                + "\" for "
                + type.getName());
        }

        return null;
    }

    @Override
    protected Class getDefaultType() {
        return null;
    }

}

http://www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/からのブログ投稿とコメントを読んで解決策を得ました

于 2012-12-23T05:19:30.753 に答える
2

同じことをしようとしていましたが(私のユースケースはすべてのタイプの列挙型に共通のコンバーターでした)、コードで確認できることから、ConvertUtilsはコンバーターとクラス間の直接マッピングのみをサポートし、基本クラスまたはインターフェイス。

基本的には、キーがクラスとコンバーターの値であるMapを使用し、クラスに基づいて適切なコンバーターを取得するには、単にMap#getを実行します。

于 2011-10-06T14:49:35.850 に答える