當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JSR303 数据效验
生活随笔
收集整理的這篇文章主要介紹了
JSR303 数据效验
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
JSR303 數(shù)據(jù)效驗
前端數(shù)據(jù)效驗成功了,就會把json數(shù)據(jù)傳遞到后端,但是有人利用接口 比如 postman 亂發(fā)送請求 那會怎么辦,于是后端也會利用 JSR303進行數(shù)據(jù)效驗
給Bean添加效驗注解 javax.validation.constraints包下 并定義自己的的message提示
@NotEmpty(messsage = "logo不能為空") @URL(message = "logo必須是一個合法的url地址") private String logo;開啟效驗功能 @Valid
- 效果:效驗錯誤以后有默認的響應
controller
給效驗的bean后緊跟一個BindingResult 就可以獲取到效驗的結(jié)果
public R save(@Valid @RequestBody BrandEntity brand,BindingResult result){if(result.hasErrors()){Map<String,String> map = new HashMap<>();//1、獲取校驗的錯誤結(jié)果result.getFieldErrors().forEach((item)->{//FieldError 獲取到錯誤提示String message = item.getDefaultMessage();//獲取錯誤的屬性的名字String field = item.getField();map.put(field,message);});return R.error(400,"提交的數(shù)據(jù)不合法").put("data",map);}else {}分組效驗 (多場景復雜效驗)
添加一個組 & 修改一個組
1、@NotBlank(message = “品牌名必須提交”,groups = {AddGroup.class,UpdateGroup.class})
- 給效驗注解標注什么情況需要進行效驗
- @Validated({AddGroup.class}) 在對應方法上進行標注
- 默認沒有指定分組的效驗注解 @NotBlank 在分組效驗情況@Validated({AddGroup.class})不生效,只會在@Validated生效
entity
/*** 品牌id*/ @Null(message = "新增不能指定Id",groups = {AddGroup.class}) @NotNull(message = "修改必須指定品牌id",groups = {UpdateGroup.class}) @TableId private Long brandId; /*** 品牌名*/ @NotBlank(message = "品牌名不能為空",groups = {AddGroup.class,UpdateGroup.class}) private String name; /*** 品牌logo地址*/ @NotEmpty(groups = {AddGroup.class}) @URL(message = "logo必須是一個合法的url地址",groups = {AddGroup.class,UpdateGroup.class}) private String logo; /*** 介紹*/ private String descript; /*** 顯示狀態(tài)[0-不顯示;1-顯示]*/ @NotNull(groups = {AddGroup.class, UpdateStatusGroup.class}) @ListValue(vals={0,1},groups = {AddGroup.class,UpdateStatusGroup.class}) private Integer showStatus; /*** 檢索首字母*/ @NotEmpty(groups = {AddGroup.class}) @Pattern(regexp = "^[a-zA-Z]$",message = "檢索首字母必須是一個字母",groups = {AddGroup.class,UpdateGroup.class}) private String firstLetter; /*** 排序*/ @NotNull(groups = {AddGroup.class}) @Min(value=0,message = "排序必須大于等于0",groups = {AddGroup.class,UpdateGroup.class}) private Integer sort;自定義效驗
編寫一個自定義的效驗注解
編寫一個自定義的效驗器何自定義的效驗注解
實現(xiàn)約束
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {private Set<Integer> set = new HashSet<>();// 初始化方法@Overridepublic void initialize(ListValue constraintAnnotation) {int[] vals = constraintAnnotation.vals();for(int val : vals) {// 將結(jié)果添加到set集合set.add(val);}}/*** 判斷效驗是否成功* @param value 需要效驗的值* @param context* @return*/@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {// 判斷是包含該值return set.contains(value);} }異常處理
這里使用到了 SpringMVC 的注解 @ControllerAdvice
1、編寫異常處理類使用SpringMvc的@ControllerAdvice
2、使用@ExceptionHandler標記方法可以處理異常
@Slf4j @RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller") public class GulimallExceptionControllerAdvice {/*** 捕獲定義的異常* @param e* @return*/@ExceptionHandler(value = MethodArgumentNotValidException.class)public R handleVaildException(MethodArgumentNotValidException e) {log.error("數(shù)據(jù)效驗出現(xiàn)問題{},異常類型:{}",e.getMessage(),e.getClass());Map<String,String> errorMap = new HashMap<>();BindingResult bindingResult = e.getBindingResult();bindingResult.getFieldErrors().forEach(fieldError -> {errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());});return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);}/*** 兜底異常* @param throwable* @return*/@ExceptionHandler(value = Throwable.class)public R handleException(Throwable throwable) {return R.error();}}異常錯誤碼定義 (重點)
后端將定義的錯誤碼寫入到開發(fā)手冊,前端出現(xiàn)對于的錯誤,就可以通過手冊查詢到對應的異常
/**** 錯誤碼和錯誤信息定義類* 1. 錯誤碼定義規(guī)則為5為數(shù)字* 2. 前兩位表示業(yè)務場景,最后三位表示錯誤碼。例如:100001。10:通用 001:系統(tǒng)未知異常* 3. 維護錯誤碼后需要維護錯誤描述,將他們定義為枚舉形式* 錯誤碼列表:* 10: 通用* 001:參數(shù)格式校驗* 11: 商品* 12: 訂單* 13: 購物車* 14: 物流***/ public enum BizCodeEnume {UNKNOW_EXCEPTION(10000,"系統(tǒng)未知異常"),VAILD_EXCEPTION(10001,"參數(shù)格式校驗失敗");private int code;private String msg;BizCodeEnume(int code,String msg){this.code = code;this.msg = msg;}public int getCode() {return code;}public String getMsg() {return msg;} }總結(jié)
以上是生活随笔為你收集整理的JSR303 数据效验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 祝大家开工大吉,工作顺利。
- 下一篇: Android——一个简单的闹钟APP