异常消息
HTTP Status 500 - Session attribute 'employee' required - not found in session
type Exception report
message Session attribute 'employee' required - not found in session
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.web.HttpSessionRequiredException: Session attribute 'employee' required - not found in session org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.raiseSessionRequiredException(AnnotationMethodHandlerAdapter.java:791) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveModelAttribute(HandlerMethodInvoker.java:766) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:363) org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:170) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:931) org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:833) javax.servlet.http.HttpServlet.service(HttpServlet.java:646) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:807) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.55 logs.
异常原因
当使用SessionAttributes注解缓存对象时,handler处理类的处理方法中存在对应的入参时,SpringMVC在implicitModel中找不到对应的对象时,SpringMVC会去判断是否使用SessionAttributes注解缓存了对应的类。如果缓存了,就会去查找对应的对象,如果找不到,就会抛出此异常。
源码:
private WebDataBinder resolveModelAttribute(String attrName, MethodParameter methodParam, ExtendedModelMap implicitModel, NativeWebRequest webRequest, Object handler) throws Exception { // Bind request parameter onto object... String name = attrName; if ("".equals(name)) { name = Conventions.getVariableNameForParameter(methodParam); } Class<?> paramType = methodParam.getParameterType(); Object bindObject; if (implicitModel.containsKey(name)) { bindObject = implicitModel.get(name); } else if (this.methodResolver.isSessionAttribute(name, paramType)) { bindObject = this.sessionAttributeStore.retrieveAttribute(webRequest, name); if (bindObject == null) { raiseSessionRequiredException("Session attribute '" + name + "' required - not found in session"); } } else { bindObject = BeanUtils.instantiateClass(paramType); } WebDataBinder binder = createBinder(webRequest, bindObject, name); initBinder(handler, name, binder, webRequest); return binder; }
解决方法
1. 方法入参的@ModelAttribute注解的value值不要与@SessionAttributes注解的value值一致。
@SessionAttributes(value={"employee"}) @Controller @RequestMapping("/emp") public class EmployeeController { @RequestMapping("/save") public ModelAndView save(@ModelAttribute(value="abc") Employee emp) throws Exception { System.out.println(emp); if(emp.getId() == null) { Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd"); emp.setHiredate(format.format(date)); employeeDao.addEmployee(emp); } else { //更新数据,实际上丢失表单中没有的数据:no,hiredate employeeDao.updateEmployeeById(emp); } ModelAndView modelAndView = new ModelAndView(); List<Employee> emps = employeeDao.getAllEmployees(); modelAndView.addObject("emps", emps); modelAndView.setViewName(VIEW_NAME_LIST); return modelAndView; } }
2. 如果方法中不使用注解@ModelAttribute改变value值的默认值(类名首字母小写),而且@SessionAttributes注解的value值又习惯性使用类名首字母小写,则只能添加@ModelAttribute标注的方法,且在map中添加对应的对象。
@ModelAttribute public void getEmployee(@RequestParam(value="id",required=false) Integer id,Map<String,Object> map) throws Exception { System.out.println("从数据库中获取一个对象: " + id); System.out.println("-----------getEmployee-------------"); //从数据库中获取对象 if(id != null) { Employee emp = employeeDao.getById(id); map.put("employee", emp); } }
相关推荐
在Spring MVC框架中,`@SessionAttributes`是一个非常重要的注解,它允许开发者将特定的模型数据持久化到HTTP会话(session)中,以便在多个请求之间共享这些数据。通常,模型数据在请求完成后就会从内存中清除,但...
除了上述的注解,Spring MVC还有许多其他注解,如`@SessionAttributes`用于在session中存储模型数据,`@ExceptionHandler`用于全局异常处理,`@InitBinder`用于初始化数据绑定行为,等等。这些注解共同构建了一个...
以上只是Spring MVC注解驱动开发的一部分知识点,实际应用中还有许多其他注解和配置,如`@RestController`、`@SessionAttributes`、`@Async`等,以及AOP(面向切面编程)、Spring Data JPA等集成技术。学习和熟练...
在Spring MVC中,注解的使用极大地简化了配置,使得开发更加高效和简洁。下面我们将深入探讨Spring MVC中的一些关键注解及其用法。 1. `@Controller`:这个注解用于标记一个类作为Spring MVC的控制器。控制器类负责...
《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及...
8. **异常处理**:Spring MVC 提供了 @ExceptionHandler 注解,允许我们在 Controller 中直接处理异常,提高代码的可读性和可维护性。 9. **视图解析**:在返回字符串 "listBoard" 的情况下,Spring MVC 会根据配置...
Spring 3.0 MVC 注解是Spring框架中用于简化Web应用开发的重要特性,特别是在处理HTTP请求和响应方面。这些注解允许开发者以声明式的方式定义控制器、方法映射以及数据绑定等行为,极大地提高了代码的可读性和可维护...
在 Spring MVC 中,注解扮演着非常重要的角色,它们使得代码更加简洁、易读,并减少了 XML 配置。下面将详细讲解 Spring MVC 中常用的注解。 1. `@Controller`:这个注解标记一个类作为 Spring MVC 的控制器。控制...
接下来,我们深入探讨一下 Spring MVC 中其他关键的注解: 1. **@Autowired**:这是 Spring 自动装配依赖注入的注解,用于将依赖的服务(如 BbtForumService)自动注入到 Controller 类的成员变量中。这样就避免了...
DispatcherServlet 是 Spring MVC 的核心组件之一,负责接收请求并分发给合适的控制器进行处理。其启动流程大致如下: 1. **类的继承关系**:`DispatcherServlet` 继承自 `FrameworkServlet`,而 `FrameworkServlet...
12. **依赖注入(DI)**:Spring MVC 基于 Spring 框架,因此可以利用 Spring 的 DI 功能,通过 XML 配置或注解实现组件间的依赖关系。 13. **AOP(面向切面编程)**:Spring MVC 可以集成 Spring AOP 实现跨切面的...
《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7...
在开发Spring Framework MVC应用程序的过程中,我们首先需要理解MVC(Model-View-Controller)设计模式。MVC是一种软件设计模式,用于将业务逻辑、数据模型和用户界面分离,以提高代码的可维护性和复用性。 Spring ...
这个基于Spring MVC的简易用户管理案例为初学者提供了一个很好的学习平台,让我们一起深入探讨其中的关键知识点。 首先,Spring MVC是Spring框架的一个模块,主要负责处理HTTP请求并返回响应。它采用了模型-视图-...
【Spring MVC注解详解】 Spring MVC 是 Spring 框架的一部分,主要负责处理 Web 应用中的请求和响应。在 Spring 2.5 版本之后,Spring MVC 引入了注解驱动的功能,极大地简化了控制器(Controller)的配置和使用。...
Spring MVC作为Spring框架的重要组成部分之一,在Spring 2.5版本中引入了基于注解的配置方式,这使得开发者能够更便捷地构建Web应用程序。相比于传统的基于XML的配置方式,基于注解的配置更加简洁、直观,同时也提高...
在Spring MVC框架中,注解的使用极大地简化了配置过程,使得开发者能够更加专注于业务逻辑。Spring 2.5引入了一系列注解,使得基于XML的配置可以被注解配置所替代,提高了开发效率和代码的可读性。下面将详细解释...
总结,Spring MVC 是一个强大且灵活的 MVC 框架,它简化了 Web 应用的开发,通过注解驱动的编程模型提高了开发效率,同时能够方便地与其他 Spring 组件和第三方库集成。在实际开发中,理解并熟练掌握 Spring MVC 的...
在Spring MVC中,`@SessionAttributes`是一个非常实用的注解,它允许我们将ModelMap中的特定属性持久化到HTTP Session中,以便在多个请求之间共享数据。这在处理需要跨请求保持状态的情况时非常有用,比如用户登录...