1. 程式人生 > 其它 >SARscape中海絲一號(HISEA-1)雷達資料處理

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