springboot引數校驗
阿新 • • 發佈:2020-09-20
目錄
引數校驗
基於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;
}