2014-02-20 40 views
7

我實現了對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轉換爲任何枚舉類。

可能嗎?我應該怎麼做?

回答

8

從目前的BeanUtils v1.9.2開始,我不認爲在使用靜態單例模式BeanUtilsConvertUtils類時,沒有辦法做到這一點。

您可以創建一個BeanUtilsBean實例,傳遞一個自定義ConvertUtilsBean實例,該實例對Enum目標有特殊處理。

一個示例如下所示(不是我的例子中,信貸的作者是 「jeremychone」): http://www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/

傑里米的簡單實現如下:

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); 
        } 
      } 
     });