Validator主要是校验用户提交的数据的合理性的,比如是否为空了,密码长度是否大于6位,是否是纯数字的
Validation相关注解含义
使用示例:
message 代表的就是对应的提示信息
在对应的实体类添加注解限制之后还需要在用到该实体的地方加上@Valid注解
完成这一步骤后进行测试
不输入参数测试得到以下输出结果:
`{
"timestamp": "2018-04-14T08:52:18.500+0000",
"status": 400,
"error": "Bad Request",
"errors": [
{
"codes": [
"NotEmpty.imUser.userName",
"NotEmpty.userName",
"NotEmpty.java.lang.String",
"NotEmpty"
],
"arguments": [
{
"codes": [
"imUser.userName",
"userName"
],
"arguments": null,
"defaultMessage": "userName",
"code": "userName"
}
],
"defaultMessage": "姓名不能为空!",
"objectName": "imUser",
"field": "userName",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotEmpty"
},
{
"codes": [
"NotEmpty.imUser.workId",
"NotEmpty.workId",
"NotEmpty.java.lang.String",
"NotEmpty"
],
"arguments": [
{
"codes": [
"imUser.workId",
"workId"
],
"arguments": null,
"defaultMessage": "workId",
"code": "workId"
}
],
"defaultMessage": "工号不能为空",
"objectName": "imUser",
"field": "workId",
"rejectedValue": null,
"bindingFailure": false,
"code": "NotEmpty"
}
],
"message": "Validation failed for object='imUser'. Error count: 2",
"path": "/user"
}`
可以看到Valid注解确实起到了作用,可是这输出格式不是我们想要的,下面就需要进行输出格式自定义
通过观察看出当参数不符合规范是会抛出BindException异常,这样的话我们就可以通过全局异常捕获来进行自定义格式输出。
SpringBoot提供了全局异常捕获注解@ControllerAdvice
首先定义一个全局异常捕获类GlobalExceptionHandler,加上注解ControllerAdvice,如下
在GlobalExceptionHandler类中定义了一个处理异常的方法handlerBindException
主要看方法上的注解:
@ExceptionHandler(BindException.class):ExceptionHandler所有的异常类只要发生
了就会这个注解所修饰的方法所捕获,代表捕获BindException异常
@ResponseBody :返回JSON格式数据
,在抛出BindException异常情况下会携带异常信息进入handlerBindException方法中
在方法中获取我们在实体类中定义的提示信息,并返回。
最后看下经过捕获后异常输出数据:
可以看出输出结果和意向中的一样。