当我们使用SpringBoot开发项目时,校验参数是一个很常见的需求。如何优雅地处理校验参数,可以让我们的代码更加简洁易懂,也能更好地保证代码的可维护性。下面我将分享一些处理校验参数的优雅方法。
1. 使用Hibernate Validator
Hibernate Validator是一个基于JSR 303规范的校验框架,它可以让我们非常方便地对参数进行校验,同时还支持国际化和自定义校验器。
首先在pom.xml中添加依赖:
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version>
</dependency>
然后在需要校验参数的类上添加@Validated
注解,在需要校验的参数上添加对应的校验注解,如@NotBlank
、@Min
、@Max
等,示例代码如下:
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
@PostMapping
public ResponseEntity<User> createUser(@RequestBody @Valid User user) {
// 创建用户
return ResponseEntity.ok(user);
}
}
此时如果请求参数不满足校验条件,会返回一个400错误,并提示具体的错误信息。
2. 定义全局异常处理器处理校验失败的异常
虽然使用Hibernate Validator可以方便地处理校验参数,但是我们可能需要处理校验失败的异常,以便返回给前端正确的错误信息。
我们可以定义全局异常处理器(@ControllerAdvice
注解),捕获校验参数失败的异常,并将错误信息封装成我们定义的标准返回格式,如下所示:
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseData handleValidationException(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
String message = result.getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(","));
return ResponseData.fail(ResultCode.PARAMS_INVALID.getCode(), message);
}
}
这样,当参数校验失败时,我们就能够返回一个标准的错误信息给前端了。
示例
下面是一个示例,演示了如何使用Hibernate Validator校验请求参数,并处理校验失败的异常:
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
@PostMapping
public ResponseEntity<User> createUser(@RequestBody @Valid User user) {
// 创建用户
return ResponseEntity.ok(user);
}
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ResponseData handleValidationException(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
String message = result.getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(","));
return ResponseData.fail(ResultCode.PARAMS_INVALID.getCode(), message);
}
}
}
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@Min(value = 18, message = "年龄不能小于18岁")
private Integer age;
// getter/setter省略...
}
这个示例中,我们使用了@NotBlank
和@Min
注解对参数进行了校验。当请求参数不符合要求时,会返回以下错误信息:
{
"code": "20001",
"message": "用户名不能为空,年龄不能小于18岁",
"data": null
}
总结:使用Hibernate Validator可以方便地处理校验参数,而定义全局异常处理器可以让我们更好地处理校验失败的异常。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot如何优雅的处理校验参数的方法 - Python技术站