我想将表单数据直接转换成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
转换为对象列表?或者,也许您知道另一个可以做到这一点的库?
答案 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());
}
}
我不知道从String
到Integer
的转换是否是自动的。让我知道。