Преобразуйте request.getParameterMap () в bean-объект со списком объектов. - PullRequest
0 голосов
/ 07 февраля 2019

Я хочу преобразовать данные формы непосредственно в бин.Первоначально я использовал 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"

Код, который я использую для преобразования, выглядит следующим образом:this:

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

С помощью связывателя данных пружины было не проблема преобразовать эти значения в bean-компонент, но точечная запись почему-то не работает с BeanUtils.Кто-нибудь знает, как должен выглядеть ввод, чтобы BeanUtils мог преобразовать foobars в список объектов?Или, может быть, вы знаете другую библиотеку, которая способна на это?

1 Ответ

0 голосов
/ 07 февраля 2019

BeanUtils.populate, похоже, не поддерживает вложенные свойства:

Этот метод использует API-интерфейсы отражения Java для идентификации соответствующих имен методов "установщика свойств" и обрабатывает аргументы установщика типа String, логическое, int, long, float и double.Кроме того, для этих типов (или соответствующих примитивных типов) также могут быть определены установщики массива .

Я нашел этот другой метод, BeanUtils.copyProperties, и здесьуказано, что

Если исходный "bean" на самом деле является картой, предполагается, что в качестве ключей он содержит строковые простые имена свойств.

Так что, думаю, у вас нет способа сделать это с 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.Дайте мне знать.

...