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?
java enums apache-commons javabeans
Ivan Mushketyk
source share