spring怎么校验
-
Spring提供了多种方式来进行校验。
- 使用注解@Validated和@Valid
Spring框架内置了javax.validation提供的校验注解,可以通过在需要校验的字段或方法参数前面加上@Validated或@Valid注解来启用校验功能。这种方式适用于直接在代码中进行校验的场景。
例如,我们需要校验一个User对象的name字段是否为空:
public class User { @NotEmpty(message = "姓名不能为空") private String name; // getter 和 setter 方法省略 } public class UserController { @PostMapping("/user") public String createUser(@Validated @RequestBody User user) { // 处理创建用户的逻辑 } }在这个例子中,我们在User对象的name字段上标注了@NotEmpty注解,当校验不通过时,会抛出MethodArgumentNotValidException异常,我们可以在异常处理器中对这个异常进行处理。
- 使用ValidationMessages.properties
Spring框架支持通过配置ValidationMessages.properties文件来定义校验时的错误消息。可以自定义校验器的错误消息,或者为特定的校验约束指定错误消息。
例如,我们可以定义校验器的错误消息,创建ValidationMessages.properties文件,并在类路径下进行配置:
NotEmpty.user.name=姓名不能为空然后在User对象的name字段上使用@NotEmpty注解:
public class User { @NotEmpty(message = "NotEmpty.user.name") private String name; // getter 和 setter 方法省略 }当校验不通过时,错误消息会显示为“姓名不能为空”。
- 使用自定义校验器
如果需要更复杂的校验逻辑,可以通过自定义校验器来实现。自定义校验器需要实现javax.validation.ConstraintValidator接口,并覆盖initialize和isValid方法。
例如,我们需要校验一个日期字符串是否为合法的日期格式:
@Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = DateValidator.class) public @interface ValidDate { String message() default "日期格式不正确"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } public class DateValidator implements ConstraintValidator<ValidDate, String> { @Override public void initialize(ValidDate constraintAnnotation) { } @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null) { return true; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf.setLenient(false); try { sdf.parse(value); return true; } catch (ParseException e) { return false; } } } public class User { @ValidDate private String birthday; // getter 和 setter 方法省略 }在这个例子中,我们定义了一个@ValidDate注解,然后编写了一个DateValidator校验器来验证日期格式。通过在User对象的birthday字段上添加@ValidDate注解,就可以进行日期格式的校验。
总结:Spring提供了多种方式来进行校验,包括使用注解@Validated和@Valid、使用ValidationMessages.properties配置文件、以及使用自定义校验器。根据具体的需求选择适合的方式进行校验,可以增强代码的健壮性和安全性。
1年前 -
Spring 提供了多种校验方式,以下是几种常用的校验方式:
- 使用注解方式校验:可以使用 Spring 提供的注解来对方法参数或类属性进行校验。常用的注解包括 @NotNull、@NotBlank、@NotEmpty、@Min、@Max、@Size 等。使用注解方式校验时,需要在类或方法上添加 @Valid 注解,并在方法参数上添加相应的校验注解。
示例代码:
@RestController public class UserController { @PostMapping("/register") public ResponseEntity registerUser(@Valid @RequestBody User user) { // 处理注册逻辑 return ResponseEntity.ok().build(); } } public class User { @NotBlank(message = "用户名不能为空") private String username; @Size(min = 6, max = 20, message = "密码长度必须在 {min} - {max} 之间") private String password; // 省略其他属性和 getter/setter 方法 }- 使用自定义校验器:如果需要进行复杂的校验逻辑,可以使用自定义校验器。自定义校验器需要实现 Spring 的 Validator 接口,并实现其中的 validate 方法。在需要校验的方法或类上添加 @InitBinder 注解,并在该方法中注册校验器。
示例代码:
@RestController public class UserController { @InitBinder("user") protected void initUserBinder(WebDataBinder binder) { binder.addValidators(new UserValidator()); } @PostMapping("/register") public ResponseEntity registerUser(@Valid @RequestBody User user) { // 处理注册逻辑 return ResponseEntity.ok().build(); } } public class UserValidator implements Validator { @Override public boolean supports(Class<?> clazz) { return User.class.equals(clazz); } @Override public void validate(Object target, Errors errors) { User user = (User) target; if (user.getUsername().length() < 6) { errors.rejectValue("username", "username.min.length", "用户名长度不能少于6位"); } // 其他校验逻辑 } }- 校验局部对象:如果需要对复杂对象的某些属性进行校验,可以使用 Spring 的 @Validated 注解配合 @Valid 注解,校验局部对象。
示例代码:
@RestController public class UserController { @PostMapping("/register") public ResponseEntity registerUser(@RequestBody @Validated(User.Register.class) User user) { // 处理注册逻辑 return ResponseEntity.ok().build(); } } public class User { public interface Register {} @NotBlank(message = "用户名不能为空", groups = Register.class) private String username; @Size(min = 6, max = 20, message = "密码长度必须在 {min} - {max} 之间", groups = Register.class) private String password; // 其他属性和校验分组 }- 自定义校验注解:除了使用 Spring 提供的校验注解外,也可以自定义校验注解。自定义校验注解需要实现 ConstraintValidator 接口,并实现其中的 isValid 方法。在需要校验的属性上添加自定义注解即可。
示例代码:
@NotBlank(message = "用户名不能为空") @CheckUsernameExists(message = "用户名已存在") private String username; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = {UsernameExistsValidator.class}) public @interface CheckUsernameExists { String message() default "Field value already exists"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } public class UsernameExistsValidator implements ConstraintValidator<CheckUsernameExists, String> { @Override public void initialize(CheckUsernameExists constraintAnnotation) { // 初始化 } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 校验逻辑 } }- 全局异常处理:可以通过实现 Spring 提供的 HandlerExceptionResolver 接口来全局处理校验异常。在校验异常发生时,可以自定义返回的错误信息及 HTTP 状态码。
@ControllerAdvice public class GlobalExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { if (ex instanceof MethodArgumentNotValidException) { // 处理方法参数校验异常 MethodArgumentNotValidException e = (MethodArgumentNotValidException) ex; BindingResult bindingResult = e.getBindingResult(); List<String> errorMessages = new ArrayList<>(); for (ObjectError objectError : bindingResult.getAllErrors()) { errorMessages.add(objectError.getDefaultMessage()); } // 返回错误信息及 HTTP 状态码 // ... } else if (ex instanceof BindException) { // 处理对象绑定校验异常 BindException e = (BindException) ex; List<String> errorMessages = new ArrayList<>(); for (ObjectError objectError : e.getAllErrors()) { errorMessages.add(objectError.getDefaultMessage()); } // 返回错误信息及 HTTP 状态码 // ... } else { // 其他异常处理逻辑 } return null; } }总结:Spring 提供了多种校验方式,可以根据实际需求选择合适的方式进行校验。使用注解方式校验简单方便,适用于简单的校验逻辑;使用自定义校验器可以处理复杂的校验逻辑;使用自定义校验注解可以扩展已有的校验注解;使用全局异常处理可以统一处理校验异常,并返回合适的错误信息及 HTTP 状态码。
1年前 -
Spring提供了多种校验方式,可以对Java对象进行校验。常用的校验方式有两种:基于注解(Annotation-based)的校验和基于接口(Interface-based)的校验。
一、基于注解的校验
基于注解的校验使用了JSR-303规范定义的注解,通过在Java类的属性上添加注解来定义校验规则。Spring框架中有一个Validation API,可以用于执行基于注解的校验。下面介绍基于注解的校验的使用流程:- 添加依赖
需要在项目的pom.xml文件中添加以下依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>-
定义校验注解
通过自定义注解来定义校验规则,可以使用Spring预定义的注解,也可以自定义注解。常用的注解有@NotNull、@NotEmpty、@Size等。 -
创建校验实体类
创建一个Java类,用于接收用户输入的数据,并在属性上添加校验注解。 -
编写校验逻辑
在需要进行校验的方法上添加注解@Valid,表示对方法的参数进行校验。
二、基于接口的校验
基于接口的校验是通过实现Spring的Validator接口来自定义校验逻辑。下面介绍基于接口的校验的使用流程:-
实现Validator接口
创建一个类,实现Validator接口,并重写两个方法:supports()和validate()。 -
定义校验逻辑
在validate()方法中编写校验逻辑,可以使用Validator接口提供的方法进行校验。 -
注册Validator
将自定义的Validator注册到Spring容器中,可以通过实现WebMvcConfigurer接口的addValidators()方法来注册。 -
在控制器中使用校验
在需要进行校验的方法的参数上添加@Valid注解,表示需要对参数进行校验。
以上是Spring中校验的基本使用方法,可以根据具体的业务需求和场景,选择合适的校验方式。无论是基于注解还是基于接口的校验,都可以通过校验结果对象来获取校验结果,并进行相应的处理。校验结果对象通常是BindingResult类型的参数,可以通过该对象的方法来判断校验是否通过,并获取错误信息。
1年前 - 添加依赖