返回
参数校验: SpringBoot中优雅实现业务校验的最佳实践
后端
2024-01-20 03:17:02
在日常开发中,业务校验不可或缺,校验得当能有效提升代码健壮性。SpringBoot框架为业务校验提供了天然支持,实现起来非常方便。
参数校验
参数校验就是检查接口请求中的参数是否符合要求,比如类型、格式、长度等。SpringBoot框架提供了多种参数校验注解,可以轻松实现参数校验。
import javax.validation.constraints.*;
public class User {
@NotNull
private String name;
@Email
private String email;
@Min(18)
private int age;
}
在控制器方法中,使用@Valid
注解即可触发参数校验。
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@PostMapping("/user")
public User createUser(@Validated @RequestBody User user) {
// ...
}
如果参数校验失败,SpringBoot会自动抛出MethodArgumentNotValidException
异常,我们可以捕获这个异常并返回友好的错误信息。
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<String> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
StringBuilder sb = new StringBuilder();
ex.getBindingResult().getAllErrors().forEach((error) -> {
sb.append(error.getDefaultMessage()).append("\n");
});
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
}
}
业务规则校验
业务规则校验是指检查业务逻辑是否符合要求,比如库存是否充足、订单是否已支付等。SpringBoot框架没有提供专门的业务规则校验注解,我们可以使用@AssertTrue
注解来实现。
import javax.validation.constraints.AssertTrue;
public class Order {
private Long productId;
private Integer quantity;
@AssertTrue(message = "库存不足")
private boolean isStockEnough() {
// ...
}
}
在控制器方法中,使用@Valid
注解即可触发业务规则校验。
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@PostMapping("/order")
public Order createOrder(@Validated @RequestBody Order order) {
// ...
}
如果业务规则校验失败,SpringBoot会自动抛出MethodArgumentNotValidException
异常,我们可以捕获这个异常并返回友好的错误信息。
可重用的校验工具类
为了方便业务校验,我们可以创建一个可重用的校验工具类。
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.Set;
public class ValidatorUtil {
private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator();
public static <T> Set<ConstraintViolation<T>> validate(T object) {
return VALIDATOR.validate(object);
}
}
使用这个工具类,我们可以轻松实现业务校验。
import com.example.util.ValidatorUtil;
public class UserService {
public void createUser(User user) {
Set<ConstraintViolation<User>> violations = ValidatorUtil.validate(user);
if (!violations.isEmpty()) {
throw new IllegalArgumentException(violations.iterator().next().getMessage());
}
// ...
}
}
总结
SpringBoot框架为业务校验提供了天然支持,我们可以轻松实现参数校验和业务规则校验。通过使用@Valid
注解和MethodArgumentNotValidException
异常,我们可以轻松处理校验失败的情况。可重用的校验工具类可以帮助我们轻松实现业务校验,提高代码的可维护性。