Контроллер формы Spring: невозможно сохранить отношения в контроллере формы - PullRequest
0 голосов
/ 18 июля 2011

У меня есть три таблицы User, Role и UserRoleRelationships (таблица соединения многие-ко-многим). В моем сервисе у меня нет проблем с редактированием пользователя и сохранением соответствующих ролей, но я не могу сделать это в контроллере.

Ожидаемое поведение в сервисе:

Hibernate: update dbo.Users set Username=?, Password=?, Email=?, Workphone=?, Privatephone=?, FullName=? where UserId=?
Hibernate: update dbo.UserRoles set Role=? where RoleId=?
Hibernate: update dbo.UserRoles set Role=? where RoleId=?

Но поведение в контроллере таково:

Hibernate: update dbo.Users set Username=?, Password=?, Email=?, Workphone=?, Privatephone=?, FullName=? where UserId=?
Hibernate: delete from UserRoleRelationships where UserId=?

Мой контроллер выглядит так:

@RequestMapping(value = "/usermanagement/edit/{userId}")
public ModelAndView initUpdateForm(@PathVariable String userId, ModelMap model) {
    model.addAttribute("user", iwUserManagementService.getUser(Integer.valueOf(userId)));
    return new ModelAndView(viewName, model);
}

@RequestMapping(value = "/usermanagement/edit/{userId}", method = RequestMethod.POST)
public ModelAndView processUpdateSubmit(@ModelAttribute("user") IWUser iwUser,
        BindingResult result, SessionStatus status){
    iwUserManagementService.saveOrUpdate(iwUser);
    status.setComplete();

    return new ModelAndView("redirect:/usermanagement", new ModelMap("user", iwUser));
}

Часть моего web.xml:

<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>flushMode</param-name>
        <param-value>AUTO</param-value>
    </init-param>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>sessionFactory</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>hibernateFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Для меня это выглядит так, будто модель пользователя в processUpdateSubmit () не возвращает роли, только опубликованные элементы. Как я могу заставить его вернуть роли?

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

Я сам исправил это, добавив @SessionAttributes (types = IWUser.class):

@Controller 
@SessionAttributes(types = IWUser.class) 
public class UserUpdateController { /* implemenation */ } 
0 голосов
/ 18 июля 2011

Из комментариев показывается, что роли «исчезают в функции процесса».

Указывается, что у вас возникли проблемы с формой или способом обработки запроса.

По моему мнению, у вас есть два варианта, в зависимости от того, что вы хотите сделать:

  • Если вы не хотите изменять роли пользователей (в этой форме), используйте объект переноса данных пользователя.вместо роли в processUpdateSubmit.Тогда вам нужно только загрузить пользователя и обновить его данными из dto.

  • Если вы хотите изменить роли пользователя (в этой форме), то вам нужно найти ошибку:

    • проверка того, что форма отправляет роли
    • проверка правильности работы преобразователей (идентификатор роли в роли)
    • проверка того, что Spring может получить доступ к коллекции ролейв вашем пользовательском объекте.
    • Если все выглядит хорошо, тогда установите точку останова для метода user.setRole() и вернитесь назад в стек вызовов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...