java - 使用 Commons BeanUtils 时,为特定类的所有子类注册 Converter 的最佳方法是什么?

标签 java apache-commons-beanutils

例如,如果我想为 java.util.Map 的所有实例注册一个转换器,是否有一些方法可以做到这一点:

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

MyConverter#convert() 方法将在何处为 Map 的任何实例(例如 HashMap)调用?

这件事的背景是我使用 BeanUtils 从数据库中填充各种不同的 bean。它们的一些属性是实现特定接口(interface)的枚举,并且需要自定义例程来设置它们的值。我希望为有问题的接口(interface)的所有实现注册一个转换器类,但找不到这样做的方法,所以最终不得不通过检查 bean 中每个属性的类来动态地完成它,并且如果它们恰好是此接口(interface)的实例,则注册我的转换器类:

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

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

b.setProperty(this, setterName, value);

这看起来很讨厌,我敢肯定一定有更好的方法吗?

最佳答案

您可以覆盖 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;
    }

}

我通过阅读博文和 Java: BeanUtils Enum Support – generic Enum converter 的评论得到了解决方案

关于java - 使用 Commons BeanUtils 时,为特定类的所有子类注册 Converter 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4956714/

相关文章:

java - 如何使用 BeanUtils copyProperties 从 boolean 值复制到 boolean 值?

java - BeanUtils.setProperty 不适用于 boolean 值?

java - 通过JSP显示BLOB(图像)

java - 使用 AffineTransform 将形状缩放/平移到给定的矩形

java - 从 Json 到 Gson 的数据模型映射返回 null

java - 带有 addXX 方法的 BeanUtils

java - apache commons beanutils,如何设置属性值?

Java流图修改未内置类的自定义类对象

java2ws长类路径maven

java - 如何将 map 转换为对象?