我正在处理一个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。
谢谢你的帮助。
实际上,您可以拥有以下功能:
@ModelAttribute("isNull")
public T returnNull() {
return null;
}
@RequestMapping("/")
public String go(@ModelAttribute("isNull") T isNull) {
return isNull ? "isNull" : "isNotNull";
}
并且将返回isNotNull
视图。
Spring-MVC
为所有方法参数创建新实例,将控制器方法中出现空指针异常的潜在风险降至最低!但请注意,这不适用于具有自定义HandlerMethodArgumentResolver
的包装器类型和类,这些类型和类可以生成null作为返回值。
为了回答您的问题,springmvc
实例化模型类的新实例,即使会话已过期。它永远不能为空!
引用自ModelAttributeMethodProcessor
javadoc:
模型属性是从模型中获取的,如果找不到,则可能使用默认构造函数(如果可用)创建。
如果没有可用的默认构造函数,Spring MVC
抛出一个BeanInstantiationException
异常
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [entity.Product]: No default constructor found
您可以安全地删除所有空指针检查。
要了解什么Spring MVC
可以在控制器方法中处理默认情况下,你应该看看代码和javadoc在sping-web
arte事实包org.springframework.web.method.annotation
和sping-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阅读