@SessionAttributes дает исключение HttpSessionRequiredException - PullRequest
3 голосов
/ 04 сентября 2011

Я использую Spring MVC 3.0.5. Я пытаюсь научиться использовать @SessionAttributes. Вот пример моего кода:

@Controller
@SessionAttributes("book")
public class BookController {

    @RequestMapping("/book/bookForm.htm")
    public ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, @Valid @ModelAttribute("book") Book book, BindingResult result) throws Exception {

        ModelMap modelMap = new ModelMap();

        return new ModelAndView("bookForm", modelMap);
    }

}

Когда я пытаюсь перейти на /book/bookForm.htm, я получаю исключение:

org.springframework.web.HttpSessionRequiredException: Session attribute 'book' required - not found in session
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseSessionRequiredException(AnnotationMethodHandlerAdapter.java:722)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:758)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:356)
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

Как я мог решить эту проблему?

Я также пытался следовать этому ответу:

Spring Framework 3 и атрибуты сеанса

Некоторые вопросы относительно этого ответа:

  1. Код запрашивающего и код выбранного ответа выглядят практически одинаково ... так где же дополнение, которое решило проблему?

  2. Пытаясь прочитать документацию , я не могу понять, что на самом деле делает эта аннотация:

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

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 сентября 2011

По сути, «метод по умолчанию», выбранный в аннотациях Spring, имеет наименьшее количество аргументов при первом вызове страницы. Чем конкретнее метод, тем меньше вероятность его использования по умолчанию.

Если вы возьмете свой @RequestMapping ("/ book / bookForm.htm") и поместите его в метод, подобный этому:

@RequestMapping("/book/bookForm.htm")
public ModelAndView setupForm() throws Exception {

    ModelMap modelMap = new ModelMap();
    // I don't remember the exact syntax here - pretending its a java.util.Map.
    modelMap.put("book", new Book());

    return new ModelAndView("bookForm", modelMap);
}

Это будет значение по умолчанию, поскольку оно имеет наименьшее количество аргументов. Вы должны создать свою форму и поместить ее в сессию / модель и просмотреть / модель карту / кухонную раковину (серьезно, комбинации параметров RequestMapping и удивительны, и смешны) при первом запросе к странице. После этого отдельные методы будут вызываться соответствующим образом на основе того факта, что теперь у вас действительно хранится атрибут сеанса «книга» (поскольку он был помещен под ключ «книга»).

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

0 голосов
/ 16 марта 2018

Добавьте эти строки кода в класс контроллера

@ModelAttribute("book")
    public UserObject getBookObject() {
        return new Book();

    }

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

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