當(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
給效驗(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生效
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)注解
實(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 祝大家开工大吉,工作顺利。
- 下一篇: 微信JSAPI支付 跟 所遇到的那些坑