Convert String to Enum using Apache BeanUtils

I have implemented a converter for the Apache BeanUtils library to convert String to an enum constant:

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

I use it as follows:

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

Undoubtedly, the setter in the myBean instance, besides the ConcreteEnumClass enumeration, is instead of java.lang.Enum, so I get the following exception when calling the BeanUtils.populate method:

 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) 

If I register EnumConverter as follows:

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

Everything works great.

Since I would like to use my EnumConverter in general, I would prefer it to be used to convert String to any enum class.

Is it possible? How can I do it?

+7
java enums apache-commons javabeans
source share
1 answer

As in the current BeanUtils v1.9.2, I do not believe that there is any way to do this using the static singleton BeanUtils and ConvertUtils classes.

You can create an instance of BeanUtilsBean by passing your own instance of ConvertUtilsBean , which has special processing for Enum purposes.

Here's an example (not my example, credit to its author "jeremychone"): http://www.bitsandpix.com/entry/java-beanutils-enum-support-generic-enum-converter/

A simple Jeremy implementation is as follows:

 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); } } }); 
+8
source share

All Articles