我正在开发一个Spring 3项目并始终检查@ModelAttribute是否为null,如果是,我将用户重定向到错误页面。
@Controller
@SessionAttributes({"myCommand"})
public class MyController {
@ModelAttribute("myCommand")
public MyCommand populate(HttpServletRequest request) {
return new MyCommand();
}
@RequestMapping(value="/user/saveFoo", method=RequestMethod.POST)
public String saveFoo(HttpServletRequest request, @ModelAttribute("myCommand") MyCommand myCommand) {
if(myCommand == null) {
// Add invalid session error here.
return "error.htm";
}
...
...
}
}
我想知道的是这项检查是否有必要。该命令是会话属性,必要时使用控制器的populate方法创建。因此,只要会话处于活动状态,命令就永远不会为空。
我不知道会话过期后会发生什么。控制器是否再次创建模型属性?如果是这样,那么无论会话状态如何,命令对象都不能为空。
感谢您的帮助。
答案 0 :(得分:1)
Spring MVC
为所有方法参数创建新实例最小化控制器方法中空指针异常的潜在风险!
但要注意,这并不适用于包含自定义HandlerMethodArgumentResolver
的包装类型和类,它们可以将null作为返回值。
要回答您的问题,Spring MVC
即使会话已过期,也会实例化您的模型类的新实例。它永远不会是空的!
引自ModelAttributeMethodProcessor
javadoc:
模型属性是从模型中获得的,或者如果找不到则可能 如果可用,则使用默认构造函数创建。
如果没有可用的默认构造函数Spring MVC
则抛出BeanInstantiationException
异常
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [entity.Product]: No default constructor found
您可以安全地删除所有空指针检查。
有关Spring MVC
默认情况下可以在控制器方法中处理的内容的概述,您应该查看spring-web
artefact package org.springframework.web.method.annotation
和spring-webmvc
artefact中的代码和javadoc。包org.springframework.web.servlet.mvc.method.annotation
。
答案 1 :(得分:0)
实际上你可以拥有以下内容:
@ModelAttribute("isNull")
public T returnNull() {
return null;
}
@RequestMapping("/")
public String go(@ModelAttribute("isNull") T isNull) {
return isNull ? "isNull" : "isNotNull";
}
将返回isNotNull
视图。