关于 spring boot 使用@Validated 验证表单 及 报错 不支持 'application/x-www-form-urlencoded;charset=UTF-8' 的解决方法

通常在前端上会出现许许多多的表单,需要填写。而填写的数据则需要验证,一般是用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  。这样是解决不了问题的。

猜你喜欢

转载自blog.csdn.net/Wicd123/article/details/87927220