当前位置: 首页 > 知识库问答 >
问题:

Spring MVC:是否有必要测试@Model属性是否为空?

蓟安歌
2023-03-14

我正在处理一个Spring 3项目,并且总是检查@ModelAt0016是否为空,如果是,我将用户重定向到错误页面。

@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。

谢谢你的帮助。

共有2个答案

殷功
2023-03-14

实际上,您可以拥有以下功能:

@ModelAttribute("isNull")
public T returnNull() {
    return null;
}

@RequestMapping("/")
public String go(@ModelAttribute("isNull") T isNull) {
    return isNull ? "isNull" : "isNotNull";
}

并且将返回isNotNull视图。

诸葛文博
2023-03-14

Spring-MVC为所有方法参数创建新实例,将控制器方法中出现空指针异常的潜在风险降至最低!但请注意,这不适用于具有自定义HandlerMethodArgumentResolver的包装器类型和类,这些类型和类可以生成null作为返回值。

为了回答您的问题,springmvc实例化模型类的新实例,即使会话已过期。它永远不能为空!

引用自ModelAttributeMethodProcessorjavadoc:

模型属性是从模型中获取的,如果找不到,则可能使用默认构造函数(如果可用)创建。

如果没有可用的默认构造函数,Spring MVC抛出一个BeanInstantiationException异常

org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [entity.Product]: No default constructor found

您可以安全地删除所有空指针检查。

要了解什么Spring MVC可以在控制器方法中处理默认情况下,你应该看看代码和javadoc在sping-webarte事实包org.springframework.web.method.annotationsping-webmvc包中的人工制品org.springframework.web.servlet.mvc.method.annotation

 类似资料:
  • 问题内容: 我有项目清单。这些物品大多数都没有库存。项目表具有ID,名称,描述。项目数量存储在另一个名为清单的表中。库存表具有item_id和库存数量。 我是否需要库存表的主键?如果是这样,我应该使用序列密钥还是复合密钥?什么时候可以没有主键的表? 编辑:谢谢大家提供的非常有益的信息。我现在将始终拥有主键,除了极少数的例外。我还学到了更多关于串行键和复合键的信息。 问题答案: 始终以拥有主键为目标

  • 口水5,方言mvel 我希望此规则仅在存在任何MappingFile对象时匹配,并且仅当带有原因码的BLuReport对象为NULL时匹配 我怎样才能写出那个比较表达式。。。我尝试了几件事都没有成功: 此外,我不得不添加retract(BR),因为更新后我一直得到一个无限循环。。。我的更新正确吗?!

  • 在静态编程语言接口中,属性是否使用空get/set语句声明有关系? 例如。。。 我很难注意到不同之处。 在实现接口时,我是否为属性使用getter/setters,或者我是否直接设置值似乎并不重要。 当通过java访问它们时,都有getters,都有getter和setters。

  • 问题内容: 在我的一个类中,我有许多方法都从相同的字典中提取值。但是,如果其中一个方法尝试访问不存在的值,则它必须调用另一个方法以使该值与该键关联。 我目前已按以下方式实现此功能,其中findCrackDepth(tonnage)为self.lowCrackDepth [tonnage]分配一个值。 但是,我也有可能这样做 我假设两者之间存在性能差异,这与值在字典中的频率有关。这个差异有多大?我正

  • 我有一个,我正试图通过SpringMVC测试来测试它。它包含以下: 当我对这个运行测试时,我在这个方法中得到一个。 有没有一种方法可以模拟这个方法,使得模拟的方法被用来代替这个方法进行测试?我已经阅读了关于这个的其他帖子,并认为我可以在测试中传递一个“AuthUser”参数,但这不起作用。最终试图让这个“用户”不要扔NPE...这是我的测试...

  • 问题内容: 我有需要在各种不同的登台环境中运行的JUnit测试。每个环境都有不同的登录凭据或该环境特定的其他方面。我的计划是将环境变量传递到VM中以指示要使用的环境。然后使用该var从属性文件中读取。 JUnit是否有任何内置功能来读取.properties文件? 问题答案: Java内置了读取.properties文件的功能,而JUnit内置了在执行测试套件之前运行安装代码的功能。 java阅读