通常在前端上会出现许许多多的表单,需要填写。而填写的数据则需要验证,一般是用js来判断这个数据的正确性及完整性。
但是这样会显得很麻烦,且页面代码杂乱。
在spring boot 中则提供了这样一个验证表单数据的机制。不需要引入什么依赖包,原生正常的spring-boot依赖内就提供了。
怎么使用呢。
首先,你需要一个与你想要验证的表单数据相同的对象。
然后,在对象属性内可以使用注解来标识判断。如下:
@NotBlank(message = "注册密码不能为空") private String nodePassword;
这只是一个注解。其他注解可以去官网查看。
这样即可把表单内的nodePassword属性与此对象属性绑定。
其次,这个机制是如何验证的呢。就是@Validated这个注解了。
在Controller层,使用该注解。如下:
public ModelAndView registrySystem(@Validated @RequestBody registryNode node, BindingResult bindingResult)
{
//如果表单数据验证有错误的化,会把实体内的那个“message = "注册密码不能为空"”填充进BindingResult的error内。
//if(bindingResult.hasErrors()) 的意思就是,如果有错误的,就会进入这个方法体内
if(bindingResult.hasErrors()) { //这里可以做你的其他判断, }
...
}
但是这个代码还是有错误的,如果你的验证实体前的注解是@RequestBody的话,无论你前端页面的数据再怎么完整,这个对象都是空的。后台会出现这个错误:Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported。
这里的解决方案,即是把@RequestBody换成@ModelAttribute 即可。
附:
尝试了许多别的解决方法
1.想要把表单的content属性改成 application/json Controller在去用@requestBody接收,结果也是不成功。
2.也尝试了PostMapping(consumes=“application/json”)以为可以转换也不行。
3.网上有些人说吧@RequestBody 换成 @RequestParam 其实也是不可取的。
首先,RequestBody 映射的是json格式的数据,RequestParam 映射的是get请求上url路径参数的那种类型数据。
得先明白前端到底传的是什么类型的数据,Controller才该使用相对应的方法去映射这个数据。才能解决问题。
而不是,单纯的RequestBody 不行就换RequestParam 。这样是解决不了问题的。