java - @SessionAttributes 给出 HttpSessionRequiredException

标签 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 ,我无法理解这个注释实际上做了什么:

相关命令对象何时保存在 session 中?是当我们进入 Controller 的方法时,还是当我们离开它时,或者每次我们操作命令对象的内容时......?命令对象什么时候开始保存在 session 中?

谢谢!

最佳答案

基本上,使用 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);
}

这将是默认值,因为它的参数数量最少。您必须在第一次请求页面时创建表单并将其放入 session /模型和 View /模型 map /厨房水槽中(说真的,RequestMapping 参数组合既很棒又荒谬)。之后,将根据您现在实际存储的“book” session 属性(因为它被放置在“book”键下)这一事实,适本地调用各个方法。

参数名称和值等都决定了默认后调用哪个方法 - 这是配置 Controller 响应 Web 请求的一种非常好的、灵活的方法,但确实需要一些时间来适应。

关于java - @SessionAttributes 给出 HttpSessionRequiredException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297145/

相关文章:

java - 当我将字符串与 == 而不是 .equals() 进行比较时,如何告诉 Eclipse 警告我

javascript - Fullcalendar with spring @ResponseBody 返回带有 406 错误 :not Acceptable Header 的 Json 数组

spring-mvc - Spring MVC @RequestParam - 空列表与空

java - 缺少 Pivotal Tomcat Server Developer Edition v3.0-config

java - AWS, Spring 启动,Tomcat : Session replication

java | Apache POI |如何在不创建行的情况下避免空指针异常

java - 如何允许在此 Java 代码中检查两个以上的单词

java - 安卓 : BKS keystore throwing error for connecting to https.

java - Spring MVC上下文路径在哪里设置?

spring - 如何跳过pre_auth_filter