Справиться с перекрывающимися именами @SessionAttributes? - PullRequest
0 голосов
/ 02 февраля 2019

Как я могу сделать так, чтобы @SessionAttributes были привязаны к соответствующим контроллерам, или очистить @SessionAttributes при преждевременном переключении рабочих процессов между контроллерами?

Пример:

Пользователь идетна веб-страницу для редактирования словаря и входит в DictionaryController.java, который создает DictionaryForm.java объект и сохраняет его в @SessionAttributes в «форме»

Обычно запись словаря выбирается в запросе GET, затем обновляетсяна POST и status.setComplete() вызывается при успехе;

Однако, если пользователь выполняет запрос GET, он щелкает на другой странице, такой как OrganizationController.java, появляется второй контроллер, пытающийся повторно использовать «форму» @SessionAttribute объект от другого контроллера и потерпит неудачу прежде, чем он достигнет метода getOrganization().(Характер того, как именно происходит сбой, не определен, так как моя консоль затмения не выводит никаких исключений, но я подозреваю, что это потому, что типы форм не совпадают)

@SessionAttributes("form")
public class DictionaryController {

    @ModelAttribute("form")
    public DictionaryForm initForm() {
        return new DictionaryForm();
    }

    @RequestMapping(value="/Dictionary" method=RequestMethod.GET)
    public String getDictionary(
        @ModelAttribute("form") DictionaryForm form) {
        ...
        return "dictionaryView";
    }    

    @RequestMapping(value="/Dictionary" method=RequestMethod.POST)
    public String updateDictionary(
        @ModelAttribute("form") DictionaryForm form, 
        SessionStatus status) { 
        ...
        status.setComplete();
        return "successView";
    }

}
@Controller
@SessionAttributes("form")
public class OrganizationController{

    @ModelAttribute("form")
    public OrganizationForm initForm() {
        return new OrganizationForm();
    }

    @RequestMapping(value="/Organization" method=RequestMethod.GET)
    public String getOrganization(
        @ModelAttribute("form") OrganizationForm form) {
        ...
        return "orgView";
    }    

    @RequestMapping(value="/Organization" method=RequestMethod.POST)
    public String updateOrganization(
        @ModelAttribute("form") OrganizationForm form, 
        SessionStatus status) { 
        ...
        status.setComplete();
        return "successView";
    }
}

1 Ответ

0 голосов
/ 05 марта 2019

Решение, которое я в итоге использовал, имело тип объекта BaseForm, от которого наследуются все типы форм.Затем в моих методах отображения запросов для запросов GET я использовал бы @ModelAttribute("form") BaseForm form и вручную проверял тип формы в теле метода, а если он не совпадает, преобразовывал его и восстанавливал в сеансе.(Замена его в сеансе может быть ненужной, если вы присоединяете его к объекту модели для запроса)

т.е..

@RequestMapping(value="/Organization" method=RequestMethod.GET)
    public String getOrganization(HttpServletRequest request,
        @ModelAttribute("form") BaseForm form) {
        if (form.getClass() != OrganizationForm.class) {
            form = new OrganizationForm();
            request.getSession().setAttribute("form", form);
        }
        ...
        return "orgView";
    }    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...