在處理後端的業務邏輯是經常會涉及表單數據的提交請求,咱們不只在前端對數據進行驗證,並且在後端也須要對數據進行驗證,以此來保證數據的完整性,然後端對於表單數據的驗證使用的最多的莫過於JSR303。前端
一、表單驗證的使用
二、因爲表單驗證引發的異常捕獲
java
使用JSR303,咱們須要引入依賴,通常來講咱們只須要引入javax.validation
便可,可是對於一些javax.validation
沒法驗證的(例如URL)咱們就須要引入hibernate
來進行驗證了。json
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.18.Final</version> <scope>compile</scope> </dependency>
自定義驗證規則,最方便的莫過於使用註解的方式對咱們的bean進行驗證,而且能夠返回咱們本身定義的返回消息。後端
JSR註釋:api
在JSR中能夠找到一些其餘註釋:數組
@Data @TableName("pms_brand") public class BrandEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 品牌id */ @TableId private Long brandId; /** * 品牌名 */ @NotEmpty(message = "品牌名不能爲空") private String name; /** * 品牌logo地址 */ @URL(message = "必須是一個合法的地址") private String logo; /** * 介紹 */ @NotEmpty(message = "介紹不能爲空") private String descript; /** * 顯示狀態[0-不顯示;1-顯示] */ private Integer showStatus; /** * 檢索首字母 */ @NotEmpty(message = "檢索首字母不能爲空") @Pattern(regexp = "/^[a-zA-Z]$/",message = "檢索必須是一個字母") private String firstLetter; /** * 排序 */ @NotNull(message = "排序不能爲空") @Min(value = 0,message = "排序的數必須大於等於零") private Integer sort; }
在對bean進行驗證後,咱們須要捕獲咱們的驗證結果。app
@Valid
爲驗證級聯標記屬性、方法參數或方法返回類型。也就是說咱們使用這個註解後驗證才生效。result.hasErrors()
判斷是否有異常,使用 result.getFieldErrors()
獲取驗證後的詳細數據/** * 保存 */ @RequestMapping("/save") public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){ Map<String,String> map = new LinkedHashMap<>(); if (result.hasErrors()){ result.getFieldErrors().forEach(item ->{ String message = item.getDefaultMessage(); String field = item.getField(); map.put(field, message); }); return R.error(400,"數據不合法").put("data",map); }else { brandService.save(brand); return R.ok(); } }
全部的controller製做廠的邏輯處理,咱們則須要使用一個統一的controller進行全部異常的捕獲測試
一、正常的控制器處理正常的邏輯 /** * 保存 */ @RequestMapping("/save") public R save(@Valid @RequestBody BrandEntity brand){ brandService.save(brand); return R.ok(); } 二、編寫一個controllerAdvice進行異常統一處理 @RestControllerAdvice("com.lomtom.mall.product.controller") public class ExceptionController { @ExceptionHandler(value = MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e){ BindingResult result = e.getBindingResult(); Map<String,String> map = new LinkedHashMap<>(); result.getFieldErrors().forEach(item -> { String message = item.getDefaultMessage(); String field = item.getField(); map.put(field, message); }); return R.error(400, "數據不合法").put("data", map); } }
與第二種同理,只是新增枚舉統一管理異常的狀態碼與消息提醒,翻遍代碼的修改與查看this
一、編寫枚舉 public enum ExceptionEnum { DATA_EXCEPTION(400,"數據不合法"); private Integer code; private String message; ExceptionEnum(Integer code, String message) { this.code = code; this.message = message; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } } 二、與第二種惟一不一樣的是全部的狀態碼與消息提示交給枚舉 return R.error(ExceptionEnum.DATA_EXCEPTION.getCode(), ExceptionEnum.DATA_EXCEPTION.getMessage()).put("data", map);
發送請求獲取返回,全部的返回結果都同樣,只是實現的方式稍有不一樣而已。hibernate
{ "msg": "數據不合法", "code": 400, "data": { "name": "品牌名不能爲空", "descript": "介紹不能爲空", "sort": "排序不能爲空", "firstLetter": "檢索首字母不能爲空" } }
關注公衆號:博奧思園
仍是那句話:你的支持是我前進的最大動力