`

Spring4MVC之SessionAttributes注解引发的异常

 
阅读更多

 

异常消息

 

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注解.docx

    在Spring MVC框架中,`@SessionAttributes`是一个非常重要的注解,它允许开发者将特定的模型数据持久化到HTTP会话(session)中,以便在多个请求之间共享这些数据。通常,模型数据在请求完成后就会从内存中清除,但...

    spring—MVC的注解实例

    除了上述的注解,Spring MVC还有许多其他注解,如`@SessionAttributes`用于在session中存储模型数据,`@ExceptionHandler`用于全局异常处理,`@InitBinder`用于初始化数据绑定行为,等等。这些注解共同构建了一个...

    spring的mvc,注解驱动

    以上只是Spring MVC注解驱动开发的一部分知识点,实际应用中还有许多其他注解和配置,如`@RestController`、`@SessionAttributes`、`@Async`等,以及AOP(面向切面编程)、Spring Data JPA等集成技术。学习和熟练...

    Spring MVC的常用注解

    在Spring MVC中,注解的使用极大地简化了配置,使得开发更加高效和简洁。下面我们将深入探讨Spring MVC中的一些关键注解及其用法。 1. `@Controller`:这个注解用于标记一个类作为Spring MVC的控制器。控制器类负责...

    Spring3MVC注解教程.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及...

    基于注解驱动的 Spring MVC

    8. **异常处理**:Spring MVC 提供了 @ExceptionHandler 注解,允许我们在 Controller 中直接处理异常,提高代码的可读性和可维护性。 9. **视图解析**:在返回字符串 "listBoard" 的情况下,Spring MVC 会根据配置...

    spring3.0MVC注解(附实例).docx

    Spring 3.0 MVC 注解是Spring框架中用于简化Web应用开发的重要特性,特别是在处理HTTP请求和响应方面。这些注解允许开发者以声明式的方式定义控制器、方法映射以及数据绑定等行为,极大地提高了代码的可读性和可维护...

    Spring MVC常用注解

    在 Spring MVC 中,注解扮演着非常重要的角色,它们使得代码更加简洁、易读,并减少了 XML 配置。下面将详细讲解 Spring MVC 中常用的注解。 1. `@Controller`:这个注解标记一个类作为 Spring MVC 的控制器。控制...

    Spring 2.5 基于注解驱动的 Spring MVC.docx

    接下来,我们深入探讨一下 Spring MVC 中其他关键的注解: 1. **@Autowired**:这是 Spring 自动装配依赖注入的注解,用于将依赖的服务(如 BbtForumService)自动注入到 Controller 类的成员变量中。这样就避免了...

    Spring MVC框架简介和使用

    DispatcherServlet 是 Spring MVC 的核心组件之一,负责接收请求并分发给合适的控制器进行处理。其启动流程大致如下: 1. **类的继承关系**:`DispatcherServlet` 继承自 `FrameworkServlet`,而 `FrameworkServlet...

    spring mvc项目后端源码

    12. **依赖注入(DI)**:Spring MVC 基于 Spring 框架,因此可以利用 Spring 的 DI 功能,通过 XML 配置或注解实现组件间的依赖关系。 13. **AOP(面向切面编程)**:Spring MVC 可以集成 Spring AOP 实现跨切面的...

    Spring MVC 3.0实战指南.ppt

    《Spring MVC 3.0实战指南》,参考《Spring 3.x企业应用开发实战》。 内容简介: 1、Spring MVC框架简介 2、HTTP请求地址映射 3、HTTP请求数据的绑定 4、数据转换、格式化、校验 5、数据模型控制 6、视图及解析器 7...

    一步一步开发Spring Framework MVC应用程序

    在开发Spring Framework MVC应用程序的过程中,我们首先需要理解MVC(Model-View-Controller)设计模式。MVC是一种软件设计模式,用于将业务逻辑、数据模型和用户界面分离,以提高代码的可维护性和复用性。 Spring ...

    spring mvc 用户管理

    这个基于Spring MVC的简易用户管理案例为初学者提供了一个很好的学习平台,让我们一起深入探讨其中的关键知识点。 首先,Spring MVC是Spring框架的一个模块,主要负责处理HTTP请求并返回响应。它采用了模型-视图-...

    spring mvc

    【Spring MVC注解详解】 Spring MVC 是 Spring 框架的一部分,主要负责处理 Web 应用中的请求和响应。在 Spring 2.5 版本之后,Spring MVC 引入了注解驱动的功能,极大地简化了控制器(Controller)的配置和使用。...

    spring mvc注释文档

    Spring MVC作为Spring框架的重要组成部分之一,在Spring 2.5版本中引入了基于注解的配置方式,这使得开发者能够更便捷地构建Web应用程序。相比于传统的基于XML的配置方式,基于注解的配置更加简洁、直观,同时也提高...

    springMVC详解以及注解说明

    在Spring MVC框架中,注解的使用极大地简化了配置过程,使得开发者能够更加专注于业务逻辑。Spring 2.5引入了一系列注解,使得基于XML的配置可以被注解配置所替代,提高了开发效率和代码的可读性。下面将详细解释...

    Spring MVC实例

    总结,Spring MVC 是一个强大且灵活的 MVC 框架,它简化了 Web 应用的开发,通过注解驱动的编程模型提高了开发效率,同时能够方便地与其他 Spring 组件和第三方库集成。在实际开发中,理解并熟练掌握 Spring MVC 的...

    spring学习之@SessionAttributes实例解析

    在Spring MVC中,`@SessionAttributes`是一个非常实用的注解,它允许我们将ModelMap中的特定属性持久化到HTTP Session中,以便在多个请求之间共享数据。这在处理需要跨请求保持状态的情况时非常有用,比如用户登录...

Global site tag (gtag.js) - Google Analytics