1. 程式人生 > 實用技巧 >springboot引數校驗

springboot引數校驗

目錄

引數校驗

基於PathVariable的正則匹配

通過PathVariable,在{}包裹的欄位後加冒號:,在加上正則。
如果不匹配正則,則前端會報出404.

/**
 * 採用正則,在pathvarable中做引數校驗
 * 如果不匹配正則,則返回404
 */
@RestController
@RequestMapping("pathVariable")
public class AppController {

    @GetMapping("/id/{id:\\d+}")
    public String getId(@PathVariable("id") Integer id) {
        return String.valueOf(id);
    }

    @GetMapping("char/{char:[a-zA-Z0-9_]+}")
    public String getChar(@PathVariable("char") String charVar) {
        return charVar;
    }

}

基於註解

新增maven依賴

        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.1.Final</version>
        </dependency>

單個欄位校驗

1、在Controller上註解@Validated
2、在欄位前加入相應註解


/**
 * 單個引數的校驗
 * 在@Validated
 */
@RestController
@RequestMapping("valid1")
@Validated
public class App2Controller {

    @GetMapping
    public String get(@NotEmpty(message = "name不能為空") String name, @Min(value = 12) Integer age) {
        return name + ":" + age;
    }

}

javabean校驗

1、在實體類上加上註解校驗

@Data
public class User {

    @NotEmpty(message = "實體類name不能為空")
    private String name;

    @Max(value = 100)
    private Integer age;
}

2、在Controller出的方法入參處加上@Validated ,BindingResult可以收集錯誤

@RestController
@RequestMapping("user")
public class App3Controller {

    @PostMapping
    public String post(@Validated @RequestBody User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            for (ObjectError allError : bindingResult.getAllErrors()) {
                System.out.println(allError.getDefaultMessage());
                throw new RuntimeException(allError.getDefaultMessage());
            }
        }
        return user.getName();
    }
}

自定義註解校驗

1、定義一個註解

@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AppValidator.class)//指定註解邏輯實現類
public @interface AppValidAnno {
    String message() default "";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

note

  • message,groups,payload三個欄位必須要
  • 需要在註解上表明邏輯的實現類,這個是ConstraintValidator的實現類
    2、實現ConstraintValidator類
/**
 * 不需要@Component
 * 實現了ConstraintValidator介面,spring會自動將其視為一個元件
 */
//@Component
public class AppValidator implements ConstraintValidator<AppValidAnno, String> {

    //注入其他邏輯類
    @Autowired
    private AppComponent appComponent;

    @Override
    public void initialize(AppValidAnno constraintAnnotation) {
        System.out.println("方法初始化");
    }

    @Override
    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        return appComponent.validStr(s);
    }
}

note

  • 可以在這個類注入其他spring元件
  • 不需要@Component,實現了ConstraintValidator介面,spring會自動將其視為一個元件
  • ConstraintValidator<AppValidAnno, String>兩個範型,第一個是對應的註解,第二個是要處理的欄位的型別
    3、和其他校驗註解的使用方式相同
@Data
public class User {

    @NotEmpty(message = "實體類name不能為空")
    private String name;

    @Max(value = 100)
    private Integer age;

    @AppValidAnno(message = "必須以app-開頭")
    private String code;

}

git

https://github.com/lexiaoyao1995/validatordemo