使用对象列表将request.getParameterMap()转换为bean

时间:2019-02-07 10:59:33

标签: java javabeans

我想将表单数据直接转换成bean。最初,我为此使用spring,但是在我当前的项目中,我们不再允许使用spring,因此我尝试在Apache BeanUtils的帮助下做一些类似的事情。我的豆子看起来像这样:

public class MyBean {
    private String foo;
    private String bar;
    private List<FooBar> fooBars;
}
public class FooBar {
    private int id;
}

提交表单后,request.getParameterMap()方法为我提供了以下地图:

"foo" : "Some text",
"bar" : "Other text",
"foobars[0].id" : "1",
"foobars[1].id" : "2",
"foobars[2].id" : "3"

我用于转换的代码如下:

MyBean bean = new MyBean();
BeanUtils.populate(bean, request.getParameterMap());

使用spring数据绑定程序,将这些值转换为Bean没问题,但是点表示法不适用于BeanUtils。有谁知道输入必须是什么样子,以便BeanUtils可以将foobars转换为对象列表?或者,也许您知道另一个可以做到这一点的库?

1 个答案:

答案 0 :(得分:0)

BeanUtils.populate似乎不支持嵌套属性:

  

此方法使用Java反射API来标识对应的   “属性设置器”方法名称,并处理   键入字符串,布尔值,整型,长整型,浮点型和双精度型。另外,数组   这些类型(或相应的原始类型)的设置器可以   也可以被识别

我找到了另一种方法BeanUtils.copyProperties,在这里指定为

  

如果原点“ bean”实际上是Map,则假定包含   字符串值的简单属性名称作为键。

所以我想您无法用BeanUtils来做到这一点。但是我可能有一个解决方法,使用PropertyUtils。此类有很多静态方法,其中包括:

我还没有尝试过,但这是一种可能的方法:

MyBean bean = new MyBean();
for (Map.Entry<String, String> entry : request.getParameterMap())
{
    try {
        PropertyUtils.setProperty(bean, entry.getKey(), entry.getValue());
    }
    catch (NoSuchMethodException exc) {
        PropertyUtils.setNestedProperty(bean, entry.getKey(), entry.getValue());
    }
}

我不知道从StringInteger的转换是否是自动的。让我知道。