我實現了對Apache的BeanUtils庫中的轉換器,用於字符串的枚舉常量:字符串轉換爲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()));
}
}
我使用的方式如下:
// Register my converter
ConvertUtils.register(new EnumConverter(), Enum.class);
Map<String, String> propMap = new HashMap<String, String>();
// fill property map
BeanUtils.populate(myBean, propMap);
不幸的是,除了ConcreteEnumClass枚舉,而不是java.lang.Enum,myBean實例中的setter,這就是爲什麼我在BeanUtils.populate方法調用期間收到以下異常的原因:
org.apache.commons.beanutils.ConversionException: Default conversion to ConcreteEnumClass failed.
at org.apache.commons.beanutils.converters.AbstractConverter.handleMissing(AbstractConverter.java:314)
at org.apache.commons.beanutils.converters.AbstractConverter.handleError(AbstractConverter.java:269)
at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:177)
at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:61)
at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:491)
at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1000)
at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:821)
at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:431)
如果我以下列方式註冊EnumConverter:
ConvertUtils.register(new EnumConverter(), ConcreteEnumClass.class);
一切炒菜完美。
由於我想在一般情況下使用我的EnumConverter,我寧願將它用於將String轉換爲任何枚舉類。
可能嗎?我應該怎麼做?