例如,如果我想为 java.util.Map 的所有实例注册一个转换器,是否有一些方法可以做到这一点:
new BeanUtilsBean().getConvertUtils().register(new MyConverter(), Map.class);
MyConverter#convert()
方法将在何处为 Map 的任何实例(例如 HashMap)调用?
这件事的背景是我使用 BeanUtils 从数据库中填充各种不同的 bean。它们的一些属性是实现特定接口(interface)的枚举,并且需要自定义例程来设置它们的值。我希望为有问题的接口(interface)的所有实现注册一个转换器类,但找不到这样做的方法,所以最终不得不通过检查 bean 中每个属性的类来动态地完成它,并且如果它们恰好是此接口(interface)的实例,则注册我的转换器类:
BeanUtilsBean b = new BeanUtilsBean();
Class< ? > propertyType = pu.getPropertyType(this, setterName);
if (isImplementationOfMyInterface(propertyType)) {
b.getConvertUtils().register(new MyConverter(), propertyType);
}
b.setProperty(this, setterName, value);
这看起来很讨厌,我敢肯定一定有更好的方法吗?
最佳答案
您可以覆盖 ConvertUtilsBean
。以下代码添加了对 Enum
的支持,但您也可以对 Map
执行相同的操作:
BeanUtilsBean.setInstance(new BeanUtilsBean(new EnumAwareConvertUtilsBean()));
类定义:
public class EnumAwareConvertUtilsBean extends ConvertUtilsBean2 {
private static final EnumConverter ENUM_CONVERTER = new EnumConverter();
@Override
public Converter lookup(Class pClazz) {
final Converter converter = super.lookup(pClazz);
if (converter == null && pClazz.isEnum()) {
return ENUM_CONVERTER;
} else {
return converter;
}
}
}
public class EnumConverter extends AbstractConverter {
private static final Logger LOGGER = LoggerFactory.getLogger(EnumConverter.class);
@Override
protected String convertToString(final Object pValue) throws Throwable {
return ((Enum) pValue).name();
}
@Override
protected Object convertToType(final Class pType, final Object pValue)
throws Throwable
{
// NOTE: Convert to String is handled elsewhere
final Class<? extends Enum> type = pType;
try {
return Enum.valueOf(type, pValue.toString());
} catch (final IllegalArgumentException e) {
LOGGER.warn("No enum value \""
+ pValue
+ "\" for "
+ type.getName());
}
return null;
}
@Override
protected Class getDefaultType() {
return null;
}
}
我通过阅读博文和 Java: BeanUtils Enum Support – generic Enum converter 的评论得到了解决方案
关于java - 使用 Commons BeanUtils 时,为特定类的所有子类注册 Converter 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4956714/