下面我将为你详细讲解如何使用Spring-Validation实现后端数据校验的攻略。
什么是Spring-Validation?
Spring-Validation是Spring框架中的一部分,可以用来实现后端的数据校验。它提供了很多常见的校验规则,也允许我们自定义校验规则。
Spring-Validation 的使用
引入依赖
首先,我们需要在pom.xml中引入Spring-Validation的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
定义校验规则
我们可以使用javax.validation.constraints包下的注解来定义校验规则。例如,我们可以为一个User类定义如下的校验规则:
public class User {
@NotNull(message = "用户名不能为空")
@Size(min = 2, max = 10, message = "用户名长度必须在{min}-{max}之间")
private String username;
@NotNull(message = "密码不能为空")
@Size(min = 6, max = 20, message = "密码长度必须在{min}-{max}之间")
private String password;
@NotNull(message = "年龄不能为空")
@Min(value = 18, message = "年龄必须大于等于{value}")
@Max(value = 120, message = "年龄必须小于等于{value}")
private Integer age;
// getters and setters...
}
上面定义了三个字段(用户名,密码,年龄),每个字段都使用了javax.validation.constraints包下的注解来定义校验规则。
校验数据
我们可以使用Spring提供的@Validated注解来标记一个需要校验数据的方法或类。例如,我们可以为一个UserController类定义如下的校验方法:
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
@PostMapping("/")
public String addUser(@RequestBody @Valid User user) {
// 处理添加用户的逻辑...
return "success";
}
}
上面的addUser方法用@Valid注解标记了User参数,这样Spring就会在方法执行前自动校验User对象中的字段。
处理校验结果
如果校验失败,Spring会抛出一个MethodArgumentNotValidException异常。我们可以通过@ControllerAdvice和@ExceptionHandler注解来统一处理这个异常。例如,我们可以为上面的UserController类定义如下的异常处理方法:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public String handle(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
StringBuilder sb = new StringBuilder();
bindingResult.getFieldErrors().forEach(
fieldError -> sb.append(fieldError.getDefaultMessage()).append(";")
);
return sb.toString();
}
}
上面的方法会把校验失败的结果(即每个字段的错误信息)组装成一个字符串返回。
示例
下面通过两个示例来演示Spring-Validation的使用。
示例1
假设我们需要为一个HTTP接口添加数据校验。请求参数是一个JSON对象,包含两个字段:姓名和年龄。我们要求姓名不能为空,年龄必须大于等于0。
首先,我们需要为请求参数定义一个类:
public class Person {
@NotBlank(message = "姓名不能为空")
private String name;
@Min(value = 0, message = "年龄必须大于等于0")
private int age;
// getters and setters...
}
上面的代码中,我们使用了@NotBlank注解(来自于javax.validation.constraints包)来校验name字段不为空,使用了@Min注解来校验age字段必须大于等于0。
然后,我们可以为处理请求的Controller类添加@Valid注解,来自动校验参数:
@RestController
@RequestMapping("/person")
public class PersonController {
@PostMapping("/")
public String addPerson(@RequestBody @Valid Person person) {
// 处理添加person的逻辑...
return "success";
}
}
上面的代码中,我们在参数Person前添加了@Valid注解,这样Spring会自动校验Person的每个字段。
最后,我们需要为Controller类定义一个异常处理方法来处理校验失败的情况:
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
public String handleValidationException(MethodArgumentNotValidException e) {
return e.getBindingResult().getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(", "));
}
}
上面的代码中,我们定义了一个GlobalExceptionHandler类,并使用@RestControllerAdvice注解标记它。然后,我们添加了一个方法,用于处理事件MethodArgumentNotValidException。其中,getFieldErrors()方法用于获取校验结果的所有错误,getDefaultMessage()方法用于获取错误的消息内容。最后,我们使用Java 8中的Stream API将多个错误消息拼接起来。
示例2
假设我们需要为一个Java Bean对象定义校验规则。Bean对象包含4个字段:用户名、密码、Email、年龄。我们要求用户名、密码、Email都不能为空,年龄必须大于等于0。
首先,我们需要定义一个Java Bean:
public class User {
@NotBlank(message = "用户名不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
@NotBlank(message = "Email不能为空")
@Email(message = "Email格式不正确")
private String email;
@Min(value = 0, message = "年龄必须大于等于0")
private int age;
// getters and setters...
}
上面的代码中,我们使用了@NotBlank、@Email、@Min等注解来定义了校验规则。其中,@NotBlank用于判断字符串不为空,@Email用于判断字符串格式为Email,@Min用于判断数字大于等于某个值。
然后,我们需要为一个Service类添加@Validated注解,来自动校验参数:
@Service
@Validated
public class UserService {
public void addUser(@Valid User user) {
// 处理添加user的逻辑...
}
}
上面的代码中,我们在参数User前添加了@Valid注解,这样Spring会自动校验User的每个字段。
最后,我们可以添加一个测试用例(例如JUnit),来测试校验逻辑是否正确:
public class UserServiceTest {
@Autowired
private UserService userService;
@Test(expected = ConstraintViolationException.class)
public void testAddUserFailed() {
User user = new User();
userService.addUser(user);
}
@Test
public void testAddUserSuccess() {
User user = new User();
user.setUsername("test");
user.setPassword("123456");
user.setEmail("[email protected]");
user.setAge(20);
userService.addUser(user);
}
}
上面的代码中,我们使用了Junit框架来测试Service类的校验逻辑。在第一个测试用例中,我们没有为User对象设置任何属性,这样会触发校验逻辑,并抛出ConstraintViolationException异常。在第二个测试用例中,我们设置了所有必要的属性,这样校验逻辑会通过。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring-Validation 后端数据校验的实现 - Python技术站