@SessionAttributes给出了HttpSessionRequiredException

时间:2011-09-04 02:55:01

标签: java spring spring-mvc annotations

我正在使用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 and session attributes

有关该答案的一些问题:

  1. 提问者的代码和所选答案的代码看起来基本相同......那么解决问题的补充在哪里?

  2. 尝试阅读documentation,我无法理解这个注释实际上是做什么的:

  3. 在会话中保存相关命令对象的时间是什么时候?当我们进入控制器的方法,或者当我们离开它时,或者每次我们操作命令对象的内容时......?命令对象何时开始在会话中保存?

    谢谢!

2 个答案:

答案 0 :(得分:1)

基本上,使用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参数组合既令人敬畏又荒谬)。之后,将根据您实际存储“book”会话属性的事实(因为它放在“book”键下)来适当地调用各个方法。

参数名称和值等都确定在默认情况下调用哪个方法 - 这是配置控制器以响应Web请求的一种非常好且灵活的方式,但它确实需要一些时间来习惯。

答案 1 :(得分:-2)

在控制器类中添加这些代码行

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

    }

使用SessuinAttributes时,U需要使用上面提到的代码在会话中添加对象