2014-02-20 20 views
7

ich einen Konverter für Apache BeanUtils Bibliothek implementiert haben für String in eine ENUM Konstante Umwandlung:Convert String ENUM Apache BeanUtils mit

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

ich es auf folgende Weise verwenden:

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

Unfortunatelly ein Setter in MyBean Instanz außer ConcreteEnumClass enum, statt java.lang.Enum, das ist, warum ich die folgende Ausnahme während BeanUtils.populate Methodenaufruf erhalten:

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) 

Wenn ich EnumConverter auf folgende Weise registrieren:

ConvertUtils.register(new EnumConverter(), ConcreteEnumClass.class); 

Alles freigegegeben.

Da möchte ich meine EnumConverter im allgemeinen Fall verwenden, würde ich es vorziehen, es String in jedem Enum Klasse konvertiert werden.

Ist es möglich? Wie soll ich das machen?

Antwort

8

Ab dem aktuellen BeanUtils v1.9.2 glaube ich nicht, es gibt eine Möglichkeit, dies zu tun, wenn Sie die statischen Singleton BeanUtils und ConvertUtils Klassen verwenden.

Sie könnten eine Instanz von BeanUtilsBean erstellen und eine benutzerdefinierte ConvertUtilsBean Instanz übergeben, die eine spezielle Behandlung für Enum-Ziele bietet.

Ein Beispiel ist hier gezeigt (nicht mein Beispiel Kredit an den Autor "jeremychone"): http://www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/

einfache Implementierung Jeremy ist wie folgt:

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