日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSR303 数据效验

發布時間:2024/3/13 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSR303 数据效验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

JSR303 數據效驗

前端數據效驗成功了,就會把json數據傳遞到后端,但是有人利用接口 比如 postman 亂發送請求 那會怎么辦,于是后端也會利用 JSR303進行數據效驗

給Bean添加效驗注解 javax.validation.constraints包下 并定義自己的的message提示

@NotEmpty(messsage = "logo不能為空") @URL(message = "logo必須是一個合法的url地址") private String logo;

開啟效驗功能 @Valid

  • 效果:效驗錯誤以后有默認的響應
    controller
@RequestMapping("/save") public R save(@Valid@RequestBody BrandEntity brand){brandService.save(brand);return R.ok(); }

給效驗的bean后緊跟一個BindingResult 就可以獲取到效驗的結果

public R save(@Valid @RequestBody BrandEntity brand,BindingResult result){if(result.hasErrors()){Map<String,String> map = new HashMap<>();//1、獲取校驗的錯誤結果result.getFieldErrors().forEach((item)->{//FieldError 獲取到錯誤提示String message = item.getDefaultMessage();//獲取錯誤的屬性的名字String field = item.getField();map.put(field,message);});return R.error(400,"提交的數據不合法").put("data",map);}else {}

分組效驗 (多場景復雜效驗)

添加一個組 & 修改一個組
1、@NotBlank(message = “品牌名必須提交”,groups = {AddGroup.class,UpdateGroup.class})

  • 給效驗注解標注什么情況需要進行效驗
  • @Validated({AddGroup.class}) 在對應方法上進行標注
  • 默認沒有指定分組的效驗注解 @NotBlank 在分組效驗情況@Validated({AddGroup.class})不生效,只會在@Validated生效
// 標記使用修改分組 public R update(@Validated(UpdateGroup.class) @RequestBody BrandEntity brand){brandService.updateById(brand);return R.ok();}

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; /*** 顯示狀態[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;

自定義效驗

編寫一個自定義的效驗注解
編寫一個自定義的效驗器何自定義的效驗注解

@Documented @Constraint(validatedBy = {ListValueConstraintValidator.class})//【可以指定多個不同的效驗器,適配不同類型的效驗】 @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) public @interface ListValue {// 三要素不能丟String message() default "{com.atguigu.gulimall.product.valid.ListValue.message}";Class<?>[] groups() default { };Class<? extends Payload>[] payload() default { };int[] vals() default { };}

實現約束

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) {// 將結果添加到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("數據效驗出現問題{},異常類型:{}",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();}}

異常錯誤碼定義 (重點)

后端將定義的錯誤碼寫入到開發手冊,前端出現對于的錯誤,就可以通過手冊查詢到對應的異常

/**** 錯誤碼和錯誤信息定義類* 1. 錯誤碼定義規則為5為數字* 2. 前兩位表示業務場景,最后三位表示錯誤碼。例如:100001。10:通用 001:系統未知異常* 3. 維護錯誤碼后需要維護錯誤描述,將他們定義為枚舉形式* 錯誤碼列表:* 10: 通用* 001:參數格式校驗* 11: 商品* 12: 訂單* 13: 購物車* 14: 物流***/ public enum BizCodeEnume {UNKNOW_EXCEPTION(10000,"系統未知異常"),VAILD_EXCEPTION(10001,"參數格式校驗失敗");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;} }

總結

以上是生活随笔為你收集整理的JSR303 数据效验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。