Iva*_*tyk 10 java enums javabeans apache-commons
我已经为Apache BeanUtils库实现了一个转换器,用于将String转换为枚举常量:
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()));
}
}
Run Code Online (Sandbox Code Playgroud)
我用以下方式使用它:
// Register my converter
ConvertUtils.register(new EnumConverter(), Enum.class);
Map<String, String> propMap = new HashMap<String, String>();
// fill property map
BeanUtils.populate(myBean, propMap);
Run Code Online (Sandbox Code Playgroud)
不幸的是myBean实例中的setter除了ConcreteEnumClass枚举,而不是java.lang.Enum,这就是我在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)
Run Code Online (Sandbox Code Playgroud)
如果我按以下方式注册EnumConverter:
ConvertUtils.register(new EnumConverter(), ConcreteEnumClass.class);
Run Code Online (Sandbox Code Playgroud)
一切都很完美.
由于我想在一般情况下使用我的EnumConverter,我宁愿将它用于将String转换为任何枚举类.
可能吗?我该怎么办?
小智 11
从当前的BeanUtils v1.9.2开始,我不相信在使用静态单例BeanUtils和ConvertUtils类时有任何方法可以做到这一点.
您可以创建一个实例BeanUtilsBean,传递一个ConvertUtilsBean对Enum目标有特殊处理的自定义实例.
这里给出了一个例子(不是我的例子,归功于其作者"jeremychone"):http: //www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/
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);
}
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6957 次 |
| 最近记录: |