日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

JSR303 数据效验

發(fā)布時(shí)間:2024/3/13 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSR303 数据效验 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JSR303 數(shù)據(jù)效驗(yàn)

前端數(shù)據(jù)效驗(yàn)成功了,就會(huì)把json數(shù)據(jù)傳遞到后端,但是有人利用接口 比如 postman 亂發(fā)送請(qǐng)求 那會(huì)怎么辦,于是后端也會(huì)利用 JSR303進(jìn)行數(shù)據(jù)效驗(yàn)

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

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

開啟效驗(yàn)功能 @Valid

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

給效驗(yàn)的bean后緊跟一個(gè)BindingResult 就可以獲取到效驗(yàn)的結(jié)果

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

分組效驗(yàn) (多場(chǎng)景復(fù)雜效驗(yàn))

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

  • 給效驗(yàn)注解標(biāo)注什么情況需要進(jìn)行效驗(yàn)
  • @Validated({AddGroup.class}) 在對(duì)應(yīng)方法上進(jìn)行標(biāo)注
  • 默認(rèn)沒有指定分組的效驗(yàn)注解 @NotBlank 在分組效驗(yàn)情況@Validated({AddGroup.class})不生效,只會(huì)在@Validated生效
// 標(biāo)記使用修改分組 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必須是一個(gè)合法的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 = "檢索首字母必須是一個(gè)字母",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;

自定義效驗(yàn)

編寫一個(gè)自定義的效驗(yàn)注解
編寫一個(gè)自定義的效驗(yàn)器何自定義的效驗(yàn)注解

@Documented @Constraint(validatedBy = {ListValueConstraintValidator.class})//【可以指定多個(gè)不同的效驗(yàn)器,適配不同類型的效驗(yàn)】 @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 { };}

實(shí)現(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);}}/*** 判斷效驗(yàn)是否成功* @param value 需要效驗(yàn)的值* @param context* @return*/@Overridepublic boolean isValid(Integer value, ConstraintValidatorContext context) {// 判斷是包含該值return set.contains(value);} }

異常處理

這里使用到了 SpringMVC 的注解 @ControllerAdvice

1、編寫異常處理類使用SpringMvc的@ControllerAdvice

2、使用@ExceptionHandler標(biāo)記方法可以處理異常

@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ù)效驗(yàn)出現(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();}}

異常錯(cuò)誤碼定義 (重點(diǎn))

后端將定義的錯(cuò)誤碼寫入到開發(fā)手冊(cè),前端出現(xiàn)對(duì)于的錯(cuò)誤,就可以通過手冊(cè)查詢到對(duì)應(yīng)的異常

/**** 錯(cuò)誤碼和錯(cuò)誤信息定義類* 1. 錯(cuò)誤碼定義規(guī)則為5為數(shù)字* 2. 前兩位表示業(yè)務(wù)場(chǎng)景,最后三位表示錯(cuò)誤碼。例如:100001。10:通用 001:系統(tǒng)未知異常* 3. 維護(hù)錯(cuò)誤碼后需要維護(hù)錯(cuò)誤描述,將他們定義為枚舉形式* 錯(cuò)誤碼列表:* 10: 通用* 001:參數(shù)格式校驗(yàn)* 11: 商品* 12: 訂單* 13: 購物車* 14: 物流***/ public enum BizCodeEnume {UNKNOW_EXCEPTION(10000,"系統(tǒng)未知異常"),VAILD_EXCEPTION(10001,"參數(shù)格式校驗(yàn)失敗");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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。