针对“springmvc项目使用@Valid+BindingResult遇到的问题”,我提供以下完整攻略:
1. 理解问题
经过实践和研究,我们发现当使用@Valid
和BindingResult
配合进行表单数据校验时,有时会遇到一些问题。
问题的根本原因在于BindingResult
的处理方式与我们期望的不太一样,它不会使@Valid
注解的校验失败,而是将校验结果存储在自己的对象中,因此我们需要强制判断BindingResult
对象中是否存在校验错误。
在这个问题的基础上,我将为您提供两个示例以更全面地理解问题和解决方案。
2. 示例一
以User
类为例:
public class User {
@NotNull(message="用户名不能为空")
private String username;
@NotNull(message="密码不能为空")
private String password;
}
我们期望对该类进行表单数据校验。
在Controller
中,我们使用@Valid
注解进行校验:
@RequestMapping("/login")
public String login(@Valid User user, BindingResult result) {
if (result.hasErrors()) {
return "error";
}
//根据用户输入执行登录代码
return "success";
}
但是在表单提交时,即使输入为空,也不会返回"error",而是直接进入success
页面。
出现这种情况的原因是,BindingResult
对象不会使@Valid
注解的校验失败,而只是将User
对象中的值进行校验,并将结果保存在BindingResult
对象中。因此,我们需要修改Controller
中的代码,将if
语句中的条件改为:
if (result.hasErrors()&&(user!=null)) {
return "error";
}
即判断result.hasErrors()
是否为true
,并且user
对象是否不为空。这里需要注意的细节是,必须先判断result.hasErrors()
是否为true
,否则当user
对象为null
时,result.hasErrors()
也会返回true
,从而导致代码逻辑错误。
3. 示例二
以Address
类为例:
public class Address {
@NotNull(message="城市不能为空")
private String city;
@NotNull(message="街道不能为空")
private String street;
}
我们期望对该类进行表单数据校验,但实际上会遇到NullpointerException
错误:
@RequestMapping("/address")
public String address(@Valid Address address, BindingResult result) {
if (result.hasErrors()) {
return "error";
}
//根据用户输入执行查询地址代码
return "success";
}
在该代码中,如果用户提交的表单数据中,city
或street
其中一项为空,将会执行result.hasErrors()
,从而返回"error"。但是,如果用户提交的表单数据中,address
为空,将会出现NullpointerException
错误。
这是因为BindingResult
在未能把校验结果存储到Address
对象中时,把Address
对象设置为了null
,导致在if (result.hasErrors())
中抛出NullpointerException
异常。因此,我们需要修改address
方法中的代码,将if
语句中的条件改为:
if ((address==null)||result.hasErrors()) {
return "error";
}
在这里,我们先判断address
对象是否为空,如果为空,直接返回"error";否则再判断result.hasErrors()
是否为true
,从而返回正确的校验结果。
4. 总结
针对“springmvc项目使用@Valid+BindingResult遇到的问题”,我们提供了以下攻略:
- 理解
BindingResult
处理方式的不同,正确判断校验结果; - 通过以上两个示例,全面了解问题的详细情况和解决方案。
希望这些内容能够对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springmvc项目使用@Valid+BindingResult遇到的问题 - Python技术站