SARscape中海絲一號(HISEA-1)雷達資料處理
前提:要先引入validation依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Validation 2.x 的22個註解
一、實體類DTO校驗
1、第一種Controller內部捕捉校驗資訊
①第一步定義dto,所有校驗都在dto的屬性上進行。
public class ValidatorDto {
@NotEmpty(message = "名字不能為空!")
public String name;
@Email(message = "email格式不正確!")
public String email;
@Min(value = 10)
public int age;
@NotEmpty(message = "家庭住址至少填寫一個")
List<String> homList;
public List<String> getHomList() {
return homList;
}
public void setHomList(List<String> homList) {
this.homList = homList;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
②第二步定義Controller,驗證的引數dto屬性要加@Validated,BindingResult引數中包含捕捉校驗資訊,程式執行過程會進入該方法體內。
@RestController
public class TestValidatorController {
@RequestMapping("/testValidator")
@ResponseBody
public ValidatorDto testValidator(@Validated ValidatorDto dto, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
List<ObjectError> listObjectError = bindingResult.getAllErrors();
for (ObjectError objectError : listObjectError) {
System.out.println(objectError.getDefaultMessage());
}
}
return dto;
}
}
③訪問引數及System.out.println輸出的校驗結果:
http://localhost:8080/testValidator?name=&[email protected]&age=5
最小不能小於10
家庭住址至少填寫一個
名字不能為空!
email格式不正確!
2、第二種校驗資訊在丟擲的異常中獲取
①第一步定義dto,所有校驗都在dto的屬性上進行。
public class ValidatorDto {
@NotEmpty(message = "名字不能為空!")
public String name;
@Email(message = "email格式不正確!")
public String email;
@Min(value = 10)
public int age;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
②第二步定義Controller,驗證的引數dto屬性要加@Validated,程式不會進入該方法體內,校驗資訊會在丟擲的異常中被捕獲(我使用的是全域性異常@ControllerAdvice+@ExceptionHandler捕獲異常資訊)。
@RestController
public class TestValidatorController {
@RequestMapping("/testValidator2")
@ResponseBody
public ValidatorDto testValidator(@Validated ValidatorDto dto) {
return dto;
}
}
③訪問引數及校驗結果:
http://localhost:8080/testValidator2?name=&[email protected]&age=5
3、分組校驗
在不同情況下,可能對JavaBean物件的資料校驗規則有所不同,有時需要根據資料狀態對JavaBean中的某些屬性欄位進行單獨驗證,groups 屬性將驗證進行分組。
①第一步定義dto,所有校驗都在dto的屬性上進行。
分組一校驗:name和age
分組二校驗:email和age
public class ValidatorDto2 {
@NotEmpty(message = "名字不能為空!", groups = ValidatorGroup1.class)
public String name;
@Email(message = "email格式不正確!", groups = ValidatorGroup2.class)
public String email;
@Min(value = 10, groups = { ValidatorGroup1.class, ValidatorGroup2.class })
public int age;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
②第二步定義分組(2個空介面類),這兩空介面類,就是上面dto中的groups 分組。
public interface ValidatorGroup1 {}
public interface ValidatorGroup2 {}
③第三步定義Controller,驗證的引數dto屬性要加@Validated,分組的class要放到Validated中,BindingResult引數中包含捕捉校驗資訊,程式執行過程會進入該方法體內。
RestController
public class TestValidatorController {
@RequestMapping("/testValidatorGroup1")
@ResponseBody
public ValidatorDto2 testValidatorGroup1(@Validated(ValidatorGroup1.class) ValidatorDto2 dto,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
List<ObjectError> listObjectError = bindingResult.getAllErrors();
for (ObjectError objectError : listObjectError) {
System.out.println(objectError.getDefaultMessage());
}
}
return dto;
}
@RequestMapping("/testValidatorGroup2")
@ResponseBody
public ValidatorDto2 testValidatorGroup2(@Validated(ValidatorGroup2.class) ValidatorDto2 dto,
BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
List<ObjectError> listObjectError = bindingResult.getAllErrors();
for (ObjectError objectError : listObjectError) {
System.out.println(objectError.getDefaultMessage());
}
}
return dto;
}
}
④訪問引數及校驗結果:
分組一:
http://localhost:8080/testValidatorGroup1?name=&[email protected]&age=5
名字不能為空!
最小不能小於10
分組二:
http://localhost:8080/testValidatorGroup2?name=&[email protected]&age=5
email格式不正確!
最小不能小於10
結果說明:name校驗只屬於分組一,email校驗只屬於分組二,age校驗屬於分組一和分組二,跟定義的dto定義一致。
二、直接引數校驗
直接引數校驗就是把dto中要校驗的屬性當做引數放到controller的引數內,所有的校驗也都放到controller中引數中,其餘處理和實體類DTO校驗無差異。
三、自定義校驗註解
預期:做一個判斷非0的註解
①定義一個註解(仿照已有的現成註解做),其中@Constraint(validatedBy = NotEqualZeroValidator.class)的NotEqualZeroValidator為自己定義的校驗類
@Documented
@Constraint(validatedBy = NotEqualZeroValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE })
@Retention(RetentionPolicy.RUNTIME)
public @interface NotEqualZero
String message() default "必須不等於0";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
②定義自己的校驗類,需要實現ConstraintValidator<NotEqualZero, Object>介面
public class NotEqualZeroValidator implements ConstraintValidator<NotEqualZero, Object>{
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
return (Integer)value != 0;
}
}
③使用自定義註解@NotEqualZero
public class ValidatorDto {
@NotEmpty(message = "名字不能為空!")
public String name;
@Email(message = "email格式不正確!")
public String email;
@NotEqualZero
public int age;
@NotEmpty(message = "家庭住址至少填寫一個")
List<String> homeList;
public List<String> getHomeList() {
return homeList;
}
public void setHomeList(List<String> homeList) {
this.homeList = homeList;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
④controller
@RestController
public class TestValidatorController {
@RequestMapping("/testValidator")
@ResponseBody
public ValidatorDto testValidator(@Validated ValidatorDto dto, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
List<ObjectError> listObjectError = bindingResult.getAllErrors();
for (ObjectError objectError : listObjectError) {
System.out.println(objectError.getDefaultMessage());
}
}
return dto;
}
}
⑤結果
http://localhost:8080/testValidator?name=&[email protected]&age=0
名字不能為空!
email格式不正確!
家庭住址至少填寫一個
必須不等於0