springboot日常开发参数校验注解

springboot日常开发参数校验注解

1. 常用的参数校验注解

2. 使用示例

3. 在Controller中使用

4. 全局异常处理

5. 自定义校验注解


边走、边悟迟早会好

在Spring Boot的日常开发中,常常使用参数校验注解来保证传入的数据符合业务逻辑或预期格式。Spring Boot内置了对JSR-303JSR-380标准的支持,主要依赖javax.validationHibernate Validator来进行参数校验。

1. 常用的参数校验注解

以下是Spring Boot常用的参数校验注解:

  • @NotNull: 字段不能为 null,适用于任何类型。
  • @NotEmpty: 字符串、集合、数组等不能为空(不允许 null 或空集合/数组等)。
  • @NotBlank: 只能用于字符串,字符串不能为 null,并且去掉空白字符后的长度必须大于0。
  • @Size: 校验字符串、集合、数组等的长度(或大小)。
    • 属性:minmax,例如:@Size(min=2, max=10)
  • @Min: 数字字段的最小值校验,适用于数值类型(IntegerLong等)。
  • @Max: 数字字段的最大值校验,适用于数值类型。
  • @Pattern: 校验字符串是否匹配指定的正则表达式。
    • 属性:regexp,例如:@Pattern(regexp="^[a-zA-Z0-9]+$")
  • @Email: 校验字符串是否是有效的邮箱格式。
  • @Past: 校验日期是否为过去的时间。
  • @Future: 校验日期是否为将来的时间。
  • @DecimalMin: 校验数值类型是否大于等于指定的值,适用于小数。
    • 属性:inclusive,指定是否允许等于这个值。
  • @DecimalMax: 校验数值类型是否小于等于指定的值,适用于小数。
  • @Positive: 校验数值是否为正数。
  • @Negative: 校验数值是否为负数。
  • @Digits: 校验数字的整数位和小数位的位数。
    • 属性:integerfraction,例如:@Digits(integer=3, fraction=2),表示整数最多3位,小数最多2位。

2. 使用示例

假设有一个用户注册的DTO类,可以使用参数校验注解来限制用户输入:

import javax.validation.constraints.*;

public class UserRegistrationDTO {

    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间")
    private String username;

    @NotBlank(message = "密码不能为空")
    @Size(min = 6, max = 100, message = "密码长度必须在6到100个字符之间")
    private String password;

    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;

    @Min(value = 18, message = "年龄必须大于等于18岁")
    @Max(value = 65, message = "年龄必须小于等于65岁")
    private Integer age;

    // Getters and Setters
}

3. 在Controller中使用

在Spring Boot的控制器中,配合@Valid@Validated注解,可以自动对请求中的参数进行校验:

import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;

@RestController
@RequestMapping("/users")
public class UserController {

    @PostMapping("/register")
    public String registerUser(@Valid @RequestBody UserRegistrationDTO user) {
        // 如果参数校验失败,Spring会自动抛出异常,返回400错误
        return "注册成功";
    }
}

4. 全局异常处理

当参数校验失败时,Spring Boot会抛出一个MethodArgumentNotValidException异常,你可以通过全局异常处理器来捕获这个异常并自定义返回结果:

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.validation.FieldError;

import java.util.HashMap;
import java.util.Map;

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Map handleValidationExceptions(MethodArgumentNotValidException ex) {
        Map errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach(error -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return errors;
    }
}

5. 自定义校验注解

如果内置注解不满足需求,还可以创建自定义校验注解:

  1. 定义注解:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = MyCustomValidator.class)
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomValidation {
    String message() default "自定义校验失败";

    Class[] groups() default {};

    Class[] payload() default {};
}
  1. 实现校验逻辑:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MyCustomValidator implements ConstraintValidator {

    @Override
    public void initialize(MyCustomValidation constraintAnnotation) {
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 自定义校验逻辑
        return value != null && value.startsWith("custom_");
    }
}

这样你就可以在实体类上使用自定义注解了。

Spring Boot的参数校验机制强大灵活,能够帮助你在开发中减少手动编写校验代码。

 感谢支持 听忆.-CSDN博客

众口难调从心就好

你可能感兴趣的:(日常开发,mysql,java,数据库)