下面是关于“SpringBoot后端进行数据校验JSR303的使用详解”的完整攻略。
一、什么是JSR303校验
JSR303是Java Bean Validation规范的一部分,用于数据验证,可以用于校验数据的正确性,比如校验输入的参数是否符合要求等。在SpringBoot应用中,可以方便地使用JSR303进行数据校验。
二、如何在SpringBoot中使用JSR303校验
2.1 引入依赖
在SpringBoot中使用JSR303需要引入以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.2 创建需要校验的Java Bean
创建一个需要校验的Java Bean,并在属性上添加校验注解。例如:
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@Size(min = 6, max = 20, message = "密码长度必须是6-20个字符")
private String password;
@Email(message = "邮箱格式不正确")
private String email;
// ...省略getter和setter方法
}
上面的例子中,@NotBlank、@Size和@Email都是校验注解,它们会根据定义的规则来对对应的属性进行校验。如果校验不通过,会返回对应的错误信息。
2.3 在Controller中进行校验
在Controller中接收前端传来的数据后,可以使用@Valid注解对Java Bean进行校验。例如:
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String createUser(@Valid @RequestBody User user) {
// ...省略保存用户的方法
return "create user success";
}
}
上面的例子中,@Valid注解表示对user参数进行校验,如果校验不通过,会抛出MethodArgumentNotValidException异常。如果需要自定义处理这个异常,可以在Controller中添加如下处理方法:
@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;
}
上面的处理方法可以将校验失败的信息返回给前端。
2.4 自定义校验注解
有时候,JSR303自带的注解不能满足业务需求,我们可以自定义校验注解。例如,我们需要校验用户的年龄必须大于18岁,可以定义一个@Adult注解:
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AdultValidator.class)
public @interface Adult {
String message() default "年龄未满18岁";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
上面的代码中,@Adult注解的实现依赖AdultValidator类。
public class AdultValidator implements ConstraintValidator<Adult, Integer> {
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return value >= 18;
}
}
上述代码中实现了AdultValidator类,该类继承自ConstraintValidator,实现了isValid方法。在该方法中编写业务逻辑判断年龄是否大于18岁。
我们在Java Bean中使用@Adult注解对年龄进行校验:
public class User {
// ...省略其他属性
@Adult(message = "年龄未满18岁")
private Integer age;
// ...省略getter和setter方法
}
2.5 示例
参考上面的步骤,我们可以在SpringBoot应用中进行JSR303数据校验。下面是一个完整的示例:
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public String createUser(@Valid @RequestBody User user) {
// ...省略保存用户的方法
return "create user success";
}
@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;
}
}
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@Size(min = 6, max = 20, message = "密码长度必须是6-20个字符")
private String password;
@Email(message = "邮箱格式不正确")
private String email;
@Adult(message = "年龄未满18岁")
private Integer age;
// ...省略getter和setter方法
}
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AdultValidator.class)
public @interface Adult {
String message() default "年龄未满18岁";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class AdultValidator implements ConstraintValidator<Adult, Integer> {
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
if (value == null) {
return true;
}
return value >= 18;
}
}
上述示例中,我们对用户的用户名、密码、邮箱和年龄等进行了校验。如果校验不通过,会返回对应的错误信息。
三、总结
本文介绍了在SpringBoot应用中使用JSR303进行数据校验的详细步骤,包括引入依赖、创建需要校验的Java Bean、在Controller中进行校验、自定义校验注解和一个完整示例。SpringBoot使用JSR303进行数据校验可以方便地校验输入参数的正确性,提高Web应用的安全性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot后端进行数据校验JSR303的使用详解 - Python技术站