Java 使用Apache BeanUtils将字符串转换为枚举
我已经为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[
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);
}
}
});