Java 使用Apache BeanUtils将字符串转换为枚举

Java 使用Apache BeanUtils将字符串转换为枚举,java,enums,javabeans,apache-commons,Java,Enums,Javabeans,Apache Commons,我已经为Apache BeanUtils库实现了一个转换器,用于将字符串转换为枚举常量: class EnumConverter implements Converter { @Override public <T> T convert(Class<T> tClass, Object o) { String enumValName = (String) o; Enum[] enumConstants = (Enum[

我已经为Apache BeanUtils库实现了一个转换器,用于将字符串转换为枚举常量:

class EnumConverter implements Converter {    
    @Override
    public <T> T convert(Class<T> tClass, Object o) {
        String enumValName = (String) o;
        Enum[] enumConstants = (Enum[]) tClass.getEnumConstants();

        for (Enum enumConstant : enumConstants) {
            if (enumConstant.name().equals(enumValName)) {
                return (T) enumConstant;
            }
        }

        throw new ConversionException(String.format("Failed to convert %s value to %s class", enumValName, tClass.toString()));
    }
}
如果我以以下方式注册EnumConverter:

// Register my converter    
ConvertUtils.register(new EnumConverter(), Enum.class);
Map<String, String> propMap = new HashMap<String, String>();
// fill property map    
BeanUtils.populate(myBean, propMap);
ConvertUtils.register(new EnumConverter(), ConcreteEnumClass.class);
一切都很好

由于我希望在一般情况下使用EnumConverter,所以我更希望它用于将字符串转换为任何enum类


可能吗?我应该怎么做?

从当前BeanUtils v1.9.2开始,我认为在使用静态singleton
BeanUtils
ConvertUtils
类时没有任何方法可以做到这一点

您可以创建一个
BeanUtilsBean
的实例,传递一个对枚举目标具有特殊处理的自定义
ConvertUtilsBean
实例

这里显示了一个示例(不是我的示例,归功于它的作者“jeremychone”):

Jeremy的简单实现如下所示:

BeanUtilsBean beanUtilsBean = new BeanUtilsBean(new ConvertUtilsBean() {
    @Override
    public Object convert(String value, Class clazz) {
        if (clazz.isEnum()) {
            return Enum.valueOf(clazz, value);
        } else {
            return super.convert(value, clazz);
        }
    }
});
BeanUtilsBean beanUtilsBean = new BeanUtilsBean(new ConvertUtilsBean() {
    @Override
    public Object convert(String value, Class clazz) {
        if (clazz.isEnum()) {
            return Enum.valueOf(clazz, value);
        } else {
            return super.convert(value, clazz);
        }
    }
});