我正在尝试使用hashmap为我的bean调用所有setter方法。键是属性名称,值是我需要通过调用setter设置的实际值。 Follwoing代码完全适用于字符串原则,但在非字符串属性(如int,double等)上失败。
for(Map.Entry<String, String> entry : settings.entrySet()){
try{
key = entry.getKey();
PropertyUtils.setProperty(bean, key, entry.getValue());
}
catch(Exception ex)
{
LOGGER.debug("failed...."+ex.getMessage());
}
}
上面的代码抛出非String字段的异常,如int / double等
failed....Cannot invoke setter on bean class - argument type mismatch - had objects of type "java.lang.String" but expected signature "int"
failed....Cannot invoke setter on bean class - argument type mismatch - had objects of type "java.lang.String" but expected signature "double"
问题是:如何避免这种例外,如何在没有此异常的情况下成功调用setter。
答案 0 :(得分:2)
你的代码就是你的Map.Entry被加载为两个String元组,所以当把值传递给setProperty时,你发送的是一个String,即使方法需要int或float等等。
尚未对此进行测试,但您可以尝试一下
for(Map.Entry<String, String> entry : settings.entrySet()){
try{
key = entry.getKey();
Class propertyClass = PropertyUtils.getPropertyDescriptor(bean, key).getPropertyType();
if (propertyClass.getName().equals('Integer')) {
PropertyUtils.setProperty(bean, key, Integer.parseInt(entry.getValue()));
} // and so with other types.
}
catch(Exception ex)
{
LOGGER.debug("failed...."+ex.getMessage());
}
}