Java SpringMVC:是否需要测试@ModelAttribute是否为null?
我正在处理一个Spring3项目,并且总是检查@ModelAttribute是否为null,如果是,我将用户重定向到错误页面Java SpringMVC:是否需要测试@ModelAttribute是否为null?,java,spring,session,spring-mvc,modelattribute,Java,Spring,Session,Spring Mvc,Modelattribute,我正在处理一个Spring3项目,并且总是检查@ModelAttribute是否为null,如果是,我将用户重定向到错误页面 @Controller @SessionAttributes({"myCommand"}) public class MyController { @ModelAttribute("myCommand") public MyCommand populate(HttpServletRequest request) { return new MyCommand
@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";
}
...
...
}
}
我想知道的是这张支票是否必要。该命令是会话属性,必要时使用控制器的“填充”方法创建。因此,只要会话处于活动状态,该命令就永远不能为null
我不知道会话过期时会发生什么。控制器是否再次创建模型属性?如果是这样,那么无论会话的状态如何,命令对象永远不能为null
感谢您的帮助。Spring MVC为所有方法参数创建新实例,将控制器方法中出现空指针异常的潜在风险降至最低! 但请注意,这不适用于具有自定义的包装器类型和类,这些类型和类可以产生null作为返回值 为了回答您的问题,
springmvc
实例化模型类的新实例,即使会话已过期。它永远不能为空
引自javadoc:
模型属性是从模型中获取的,或者如果可能找不到,则从模型中获取
使用默认构造函数(如果可用)创建
如果没有可用的默认构造函数,Spring MVC
抛出一个BeanInstantiationException
异常
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [entity.Product]: No default constructor found
您可以安全地删除所有空指针检查
有关默认情况下,
Spring-MVC
可以在控制器方法中处理的内容的概述,您应该查看Spring-web
artifact包中的code和javadoc以及Spring-webmvc
artifact包中的artifact。实际上,您可以拥有以下内容:
@ModelAttribute("isNull")
public T returnNull() {
return null;
}
@RequestMapping("/")
public String go(@ModelAttribute("isNull") T isNull) {
return isNull ? "isNull" : "isNotNull";
}
并且
isNotNull
视图将被返回。我相信如果@modeldattribute
来自会话,并且您没有@modeldattribute
方法来创建MyCommand
并且您的会话已超时,那么它可能是null
。但是,这是一个很容易看到的测试。打开你的应用程序,在你点击这个处理程序之前找到正确的点,让它停下来,比如说,一个小时或者任何你设置了会话超时的时间。继续,看看你是否在那里得到一个空值(可能想在那里放一个SOP,这样你就知道它是空的)。