Значения объекта команды Spring MVC 3 теряются между операциями GET и POST - PullRequest
4 голосов
/ 05 января 2012

Мой объект домена не хранит значения, которые не указаны явно в файле JSP между операцией GET и POST на одном контроллере. Вот пример с опущенной проверкой ошибок

У меня есть доменный объект.

class foo
{
    private int fieldA;
    private String fieldB;
    // .. getters and setters omitted
}

Контроллер

@Controller
public class MyController
{
@Autowired
private IDaoService daoService;

@RequestMapping(value = "/display", method = RequestMethod.GET)
public String newForm(@RequestParam("id") Long id, Model model, Principal principal) throws Exception
{
    // check that the user has permissions
    ...

    // get the object
    Foo foo = daoService.read(id);
    // at this point foo.fieldA is equal to the input id
    model.addAttribute("foo", foo);

    // return the JSP path
}

@RequestMapping(value="/update", method = RequestMethod.POST)
public String update(@ModelAttribute("foo") Foo foo,
        BindingResult result, 
        Principal principal,
        Model model) throws Exception

{   
    // ERROR - at this point, fieldA is null

}
}

1012 * JSP *

    <form:form  method="post" commandName="foo">
        <fieldset>
            <legend>Invest</legend>
            <div class="fm-req">
                <label for="fm-name">Field B</label>    
                <spring:bind path="fieldB">
                    <input id="fm-name" type="text" name="${status.expression}" value="${status.value}" ></input>
                </spring:bind>
            </div>
            <div id="fm-submit" class="fm-req">
                <INPUT type="submit" value="Submit" name="Submit" />        
            </div>
        </fieldset>
    </form:form>                

Я бы подумал, что JSP получает объект, созданный в newForm, у которого установлено fieldA (и, возможно, fieldB). У пользователя есть возможность изменить fieldB, а затем нажать «Отправить». Я много читал документы Spring и проверял веб-сайты, но не могу выяснить, почему foo.fieldA имеет значение null в методе обновления в контроллере.

Из того, что я понимаю о Spring MVC, этот шаблон выглядит стандартно, но, пожалуйста, не стесняйтесь меня поправлять.

Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 05 января 2012

Вы можете использовать один из следующих:

  1. Используйте способ Ральфа для скрытого поля.
  2. Изменить тип Foo.fieldA на частный Integer Foo

Причина может быть: Foo.fieldA создает проблему, поскольку для значения NULL задано значение типа int fieldA.

0 голосов
/ 05 января 2012

Это ожидаемое поведение.

Оба экземпляра (в newForm и update) объекта foo (в именах классов Java должны начинаться с верхнего регистра) являются полностью независимыми друг от друга.

Итак, создайте скрытое поле или поместите его в сеанс. Я бы порекомендовал скрытое поле:

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