发生错误的例子如下:
@SessionAttributes(value = {"user"},types = {String.class})//该注解只能放在类上,而不能够放在方法上边
@RequestMapping("/springmvc")
@Controller
public class HelloWorld {
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改: "+user);
return "success";
}
}
原因是当前的 Handler 使用了 @SessionAttributes 注解修饰, 若使用了该注解, 且 @SessionAttributes 注解的 value 属性值中包含了 key, 则会从 HttpSession 中来获取 key 所
对应的 value 值, 但是当前您HttpSession并没有相应的对象,所以会抛出异常。
解决方案有2,
其一:
@SessionAttributes(value = {"user"},types = {String.class})//该注解只能放在类上,而不能够放在方法上边
@RequestMapping("/springmvc")
@Controller
public class HelloWorld {
@RequestMapping("/testModelAttribute")
public String testModelAttribute(@modelAttribute("abc")User user){
System.out.println("修改: "+user);
return "success";
}
}
或者:
@SessionAttributes(value = {"abc"},types = {String.class})//该注解只能放在类上,而不能够放在方法上边
@RequestMapping("/springmvc")
@Controller
public class HelloWorld {
@RequestMapping("/testModelAttribute")
public String testModelAttribute(User user){
System.out.println("修改: "+user);
return "success";
}
}
POJO属性名称和@SessionAttributes中的数据要不一致,让springmvc重新创建一个对象,坏处是会丢失掉原有对象的信息。
其二:
添加@ModelAttribute:
@ModelAttribute
public void getUser(@RequestParam(value = "id",required = false) Integer id,Map<String,Object> map){
if (id!=null){
User user=new User(1,"Tom","12346","hat@nskdnsdk.com",12);//假设是从数据库中获取的对象
System.out.println("从数据库中获取一个对象:"+user);//把从数据库中获取的对象放到map中
map.put("user",user);
}
}
这个例子中创建了一个user对象,并且放到了HttpSession域中,所以当提交表单的时候就可以从session域中取出这个键所对应的对象。