springboot 引數校驗
阿新 • • 發佈:2021-08-11
1、場景
1)引數為實體類
web層需要對前端傳輸的資料做校驗,如果按照下面的程式碼寫,就太浪費時間了,並且程式碼看起來很亂。
public AjaxResult queryUserProjectContent(AppletProject appletProject){ if (appletProject.getId() == null) { return AjaxResult.error("id為空"); } if (appletProject.getContent() == null) { return AjaxResult.error("內容為空"); } if (appletProject.getTitle() == null) { return AjaxResult.error("標題為空"); } if (appletProject.getCoverImg() == null) { return AjaxResult.error("首圖為空"); } }
2)引數為單型別資料
public AjaxResult queryDownloadInfo(String outTradeNo){
if(outTradeNo == null) {
return AjaxResult.error("錯誤");
}
Map<String, Object> map = microProjectService.queryDownloadInfo(outTradeNo);
return AjaxResult.success(map);
}
2、改進
1)入參為實體類
引入pom
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.3.1.Final</version> </dependency>
實體類加上註解
@Data public class ValidDemo { @Size(min = 3, max = 12, message = "使用者名稱必須的長度必須是3到12個字母之間") @Pattern(regexp = "^[a-z]+$", message = "使用者名稱必須是a-z小字母") private String name; @Size(min = 6, max = 6, message = "密碼必須是6位數字") @Pattern(regexp = "^[0-9]+$", message = "密碼必須是6位數字") private String password; @Range(min = 1, max = 9, message = "範圍只能1到9") private Integer range; @NotNull(message = "郵箱不能為Null") @Email(regexp = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])", message = "郵箱格式有誤") private String email; }
web層入參前加上@Valid
@GetMapping("/validdemo")
public Map<String,Object> demo(@Valid ValidDemo validDemo){
return ApiResultMap.successResult(validDemo);
}
全域性處理異常
@ExceptionHandler(value = { BindException.class })
public Map<String, Object> validationException(BindException ex) {
log.error(ex.getBindingResult().getFieldError().getDefaultMessage());
return ApiResultMap.errorResult(ex.getBindingResult().getFieldError().getDefaultMessage());
}
2)入參為單資料型別
配置 MethodValidationPostProcessor
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
web層加上註解
@Validated
@RestController
public class DemoController {}
方法上加上校驗
@GetMapping("/validdemo3")
public Map<String,Object> demo3(@NotNull String str, @NotNull @Range(min = 0, max = 10) Integer a){
return ApiResultMap.successResult(str + a);
}
全域性異常校驗
/**
* 引數校驗報錯異常
*/
@ExceptionHandler(ConstraintViolationException.class)
public AjaxResult constraintViolationException(ConstraintViolationException e) {
String message = e.getMessage();
String substring = message.substring(message.indexOf(".") + 1);
return AjaxResult.error(substring.replace(": ", ""));
}
參考https://www.jianshu.com/p/1ed48f2ef31a文章,如需更詳細的內容,請訪問他的部落格。
我的個人搭建的部落格:https://www.51bishe.site 大家可以多關注下,謝謝個人部落格:https://www.51bishe.site