springboot 參數校驗

一、場景

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);
}

二、改進

1)入參爲實體類

引入pomjava

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.1.Final</version>
</dependency>

實體類加上註解web

@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層入參前加上@Validapp

@GetMapping("/validdemo")
public Map<String,Object> demo(@Valid ValidDemo validDemo){
    return ApiResultMap.successResult(validDemo);
}

全局處理異常hibernate

@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)入參爲單數據類型

配置 MethodValidationPostProcessorcode

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
  return new MethodValidationPostProcessor();
}

web層加上註解regexp

@Validated
@RestController
public class DemoController {}

方法上加上校驗get

@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文章,如需更詳細的內容,請訪問他的博客。string

我的博客:https://www.51bishe.site

相關文章
相關標籤/搜索