springboot日常开发参数校验注解
1. 常用的参数校验注解
2. 使用示例
3. 在Controller中使用
4. 全局异常处理
5. 自定义校验注解
边走、边悟迟早会好 |
在Spring Boot的日常开发中,常常使用参数校验注解来保证传入的数据符合业务逻辑或预期格式。Spring Boot内置了对JSR-303
和JSR-380
标准的支持,主要依赖javax.validation
和Hibernate Validator
来进行参数校验。
以下是Spring Boot常用的参数校验注解:
null
,适用于任何类型。null
或空集合/数组等)。null
,并且去掉空白字符后的长度必须大于0。min
和 max
,例如:@Size(min=2, max=10)
。Integer
、Long
等)。regexp
,例如:@Pattern(regexp="^[a-zA-Z0-9]+$")
。inclusive
,指定是否允许等于这个值。integer
和 fraction
,例如:@Digits(integer=3, fraction=2)
,表示整数最多3位,小数最多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
}
在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 "注册成功";
}
}
当参数校验失败时,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;
}
}
如果内置注解不满足需求,还可以创建自定义校验注解:
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 {
@Override
public void initialize(MyCustomValidation constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// 自定义校验逻辑
return value != null && value.startsWith("custom_");
}
}
这样你就可以在实体类上使用自定义注解了。
Spring Boot的参数校验机制强大灵活,能够帮助你在开发中减少手动编写校验代码。
感谢支持 听忆.-CSDN博客
众口难调从心就好 |