Объект команды Spring MVC Annotation Based Controller теряет значения в POST - PullRequest
1 голос
/ 07 декабря 2010

Я загружаю объект пользователя, вызывающий службу, а затем сохраняю этого пользователя как объект команды в модели на GET в контроллере.Этот пользовательский объект имеет много свойств, которые не отображаются на странице jsp.После отправки формы я получаю объект команды в контроллере на POST.Но, как ни странно, я вижу только те свойства в объекте команды, которые сопоставлены со страницей jsp.Все остальные свойства, которые были там, когда я загружал объект, потеряны.Мне нужны все свойства объекта, чтобы можно было успешно сохранить его в базе данных.

Кто-нибудь может мне помочь решить эту проблему?Спасибо!

Обновление

Я добавляю код, чтобы лучше его понять.В обработчике POST я ожидал, что объект команды будет иметь все свойства, которые были загружены в обработчик GET, в дополнение к свойствам, связанным с jsp.Вместо этого я теряю все свойства, кроме тех, которые связаны с JSP.Я что-то здесь не так делаю?

@RequestMapping(method = RequestMethod.GET)
    public String showForm(ModelMap model, HttpSession session, HttpServletRequest request) throws Exception {
        UserBean user = Util.getUser(session);
        UserBean command = (UserBean)userProfileService.loadByUserName(user.getUserName());
        model.addAttribute("command", command);
        return formView;
    }

@RequestMapping(method = RequestMethod.POST)
    public String onSubmit(@ModelAttribute("command") UserBean command, BindingResult result, HttpSession session) throws Exception {
     UserBean user = (UserBean) command;
         userProfileService.saveUser(user);
         return "successView";
}

Обновление

Я добавляю некоторый код, чтобы лучше его понять.В обработчике POST я ожидал, что объект команды будет иметь все свойства, которые были загружены в обработчик GET, в дополнение к свойствам, связанным с jsp.Вместо этого я теряю все свойства, кроме тех, которые связаны с JSP.Я что-то здесь не так делаю?

@RequestMapping(method = RequestMethod.GET) public String showForm(ModelMap model, HttpSession session, HttpServletRequest request) throws Exception { UserBean user = Util.getUser(session); UserBean command = (UserBean)userProfileService.loadByUserName(user.getUserName()); model.addAttribute("command", command); return formView; }

@RequestMapping(method = RequestMethod.POST) public String onSubmit(@ModelAttribute("command") UserBean command, BindingResult result, HttpSession session) throws Exception { UserBean user = (UserBean) command; userProfileService.saveUser(user); return "successView"; }

Обновление

Если я сохраню объект команды в сеансе, как jsp будет связывать свойства.Я думал, что мне нужно хранить его в модели для этого?Не могли бы вы объяснить, пожалуйста.

Обновление

Хранение объекта команды в сеансе решает проблему.Я смог сохранить его, используя

@SessionAttributes ("command")

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Это ожидаемое поведение.Spring не берет ваш существующий объект (как бы он его получил?) - он создает новый и заполняет его данными.

Вы можете использовать аннотированный метод @ModelAttribute, чтобы указать метод, который будет загружатьсуществующий объект из хранилища (db?) по его идентификатору (отправлен).

@ Аннотированные методы ModelAttribute выполняются перед выбранным аннотированным методом-обработчиком @RequestMapping.Они эффективно заполняют неявную модель конкретными атрибутами, часто загружаемыми из базы данных.К такому атрибуту уже можно получить доступ через аннотированные параметры метода-обработчика @ModelAttribute в выбранном методе-обработчике, возможно, с привязкой и проверкой, примененной к нему.

0 голосов
/ 09 октября 2015

@ ModelAttribute используется для прямого задания значений в объекте Student из jsp; в противном случае в сервлете вы должны получить свойства с помощью request.getattribute () и затем вызвать метод сеттера студента.так что вы можете использовать оба ключевых слова на странице JSP.

<form action="grade" method="get" name="contact1" modelAttribute="contact1">
               </form>

или

0 голосов
/ 07 декабря 2010

Значения Spring-MVC Model становятся атрибутами области запроса в вашем JSP. Это односторонний перевод, Spring-MVC не восстанавливает значения Model, когда пользователь отправляет форму с вашей страницы.

Когда мне нужно сохранить информацию между GET и POST (то есть установить что-то в GET и прочитать обратно в POST), я устанавливаю атрибут Session.

В вашем случае я считаю, что вам нужно будет выполнить одно из следующих действий:

  1. Вызов Util.getUser(session); в методе onSubmit.
  2. Сохраните объект command в сеансе в showForm и получите его методом onSubmit>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...