springboot日常开发参数校验注解
🎈边走、边悟🎈迟早会好 |
在Spring Boot的日常开发中,常常使用参数校验注解来保证传入的数据符合业务逻辑或预期格式。Spring Boot内置了对JSR-303
和JSR-380
标准的支持,主要依赖javax.validation
和Hibernate Validator
来进行参数校验。
1. 常用的参数校验注解
以下是Spring Boot常用的参数校验注解:
- @NotNull: 字段不能为
null
,适用于任何类型。 - @NotEmpty: 字符串、集合、数组等不能为空(不允许
null
或空集合/数组等)。 - @NotBlank: 只能用于字符串,字符串不能为
null
,并且去掉空白字符后的长度必须大于0。 - @Size: 校验字符串、集合、数组等的长度(或大小)。
- 属性:
min
和max
,例如:@Size(min=2, max=10)
。
- 属性:
- @Min: 数字字段的最小值校验,适用于数值类型(
Integer
、Long
等)。 - @Max: 数字字段的最大值校验,适用于数值类型。
- @Pattern: 校验字符串是否匹配指定的正则表达式。
- 属性:
regexp
,例如:@Pattern(regexp="^[a-zA-Z0-9]+$")
。
- 属性:
- @Email: 校验字符串是否是有效的邮箱格式。
- @Past: 校验日期是否为过去的时间。
- @Future: 校验日期是否为将来的时间。
- @DecimalMin: 校验数值类型是否大于等于指定的值,适用于小数。
- 属性:
inclusive
,指定是否允许等于这个值。
- 属性:
- @DecimalMax: 校验数值类型是否小于等于指定的值,适用于小数。
- @Positive: 校验数值是否为正数。
- @Negative: 校验数值是否为负数。
- @Digits: 校验数字的整数位和小数位的位数。
- 属性:
integer
和fraction
,例如:@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<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach(error -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}
}
5. 自定义校验注解
如果内置注解不满足需求,还可以创建自定义校验注解:
- 定义注解:
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<? extends Payload>[] payload() default {};
}
- 实现校验逻辑:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MyCustomValidator implements ConstraintValidator<MyCustomValidation, String> {
@Override
public void initialize(MyCustomValidation constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 自定义校验逻辑
return value != null && value.startsWith("custom_");
}
}
这样你就可以在实体类上使用自定义注解了。
Spring Boot的参数校验机制强大灵活,能够帮助你在开发中减少手动编写校验代码。
🌟感谢支持 听忆.-CSDN博客
🎈众口难调🎈从心就好 |