Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringMVC:是否需要测试@ModelAttribute是否为null?_Java_Spring_Session_Spring Mvc_Modelattribute - Fatal编程技术网

Java SpringMVC:是否需要测试@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

我正在处理一个Spring3项目,并且总是检查@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";
    }
    ...
    ...
  }
}
我想知道的是这张支票是否必要。该命令是会话属性,必要时使用控制器的“填充”方法创建。因此,只要会话处于活动状态,该命令就永远不能为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,这样你就知道它是空的)。