Как заполнить несколько @ModelAttribute в методе POST, не создавая класс-оболочку? - PullRequest
2 голосов
/ 28 декабря 2011

Предположим, у меня есть следующий обработчик

public class Foo
{
        private String bar; //setter and getter included
}

@Controller
public class MyController
{
    @RequestMapping( "/test" )
    public String doGetModels(
        @ModelAttribute( "foo1" ) Foo foo1,
        @ModelAttribute( "foo2" ) Foo foo2 )
    {
        // do something
        return "view";
    }
}

И у меня есть следующая разметка

<form action="test">
  <input type="text" name="foo1.bar"/>
  <input type="text" name="foo2.bar"/>
  <input type="submit" value="save"/>
</form>

Мои атрибуты Model не заполняются. Я должен удалить любой из атрибутов ModelA и изменить name="foo1.bar" на name="bar", чтобы все заработало. Может кто-нибудь сказать мне, как решить эту проблему, не создавая класс-оболочку в качестве решения?

1 Ответ

1 голос
/ 28 декабря 2011

Вам понадобится зарегистрированный Конвектор, чтобы преобразовать строку в Foo.

, а затем вам нужно удалить .bar из атрибута имени.

@ См. Spring Reference: Глава6.5 Преобразование типа Spring 3


Другое решение

@RequestMapping( "/test" )
public String doGetModels(
    @ModelAttribute( "fooBar1" ) Object fooBar1,
    @ModelAttribute( "fooBar2" ) Object fooBar2 )
{
    // do something
    return "view";
}


<form action="test">
  <input type="text" name="fooBar1"/>
  <input type="text" name="fooBar2"/>
  <input type="submit" value="save"/>
</form>

То, что вы пробовали, просто невозможно.Причина:

public String doGetModels(
    @ModelAttribute( "foo1" ) Foo foo1, ...)

Это просто ярлык для

public String doGetModels(ModelMap model, ...)
    Foo foo1 = (Foo) mode.get("foo1");

Но ModelMap (если он заполнен) из запроса не знает о структуре Foo.Для этой карты существует только набор значений - некоторые с точкой в ​​имени и одинаковым префиксом для имени, но это не означает, что они образуют один объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...