返回

参数校验: SpringBoot中优雅实现业务校验的最佳实践

后端

在日常开发中,业务校验不可或缺,校验得当能有效提升代码健壮性。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异常,我们可以轻松处理校验失败的情况。可重用的校验工具类可以帮助我们轻松实现业务校验,提高代码的可维护性。