Java Bean Utils用非String类型调用所有setter

时间:2014-10-06 23:38:15

标签: java apache-commons-beanutils

我正在尝试使用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。

1 个答案:

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