<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在 javax.validation.constraints包中定義了非常多的校驗註解,引入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
在實體類上新增對應註解即可,
實體類:
package com.zhmsky.mallproduct.entity; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; import lombok.Data; import javax.validation.constraints.NotBlank; /** * 品牌 * * @author zhmsky * @email zhmsky@gmail.com * @date 2022-07-30 16:40:28 */ @Data @TableName("pms_brand") public class BrandEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 品牌名 */ @NotBlank(message = "品牌名不能為空") private String name; }
message可指定校驗說明,
接下來在對應的controller介面方法中使用@Valid 註解來指定介面引數校驗,後面緊跟BindingResult來接收校驗結果,當發生校驗失敗則封裝並返回校驗失敗資訊,如果通過校驗則執行相關邏輯
@RequestMapping(value = "/save",method = RequestMethod.POST) public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){ if(result.hasErrors()){ Map<String, String> map = new HashMap<>(); //獲取校驗結果 for (FieldError fieldError : result.getFieldErrors()) { //獲取錯誤提示 String message = fieldError.getDefaultMessage(); //校驗錯誤的欄位 String field = fieldError.getField(); //封裝錯誤 map.put(field,message); } return R.error(20001,"引數校驗失敗").put("errorMap",map); } brandService.save(brand); return R.ok(); }
如果在每一個介面都進行引數校驗例外處理,工作量比較大,並且程式碼比較繁瑣,於是引入全域性例外處理,
也就是@RestControllerAdvice+@ExceptionHandler註解的使用。
package com.zhmsky.mallproduct.exception; import com.zhmsky.common.utils.R; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import java.util.HashMap; import java.util.Map; /** * 同意例外處理類 * @author zhmsky * @date 2022/8/1 21:36 */ @Slf4j @RestControllerAdvice(basePackages = {"com.zhmsky.mallproduct.controller"}) public class MallProductControllerAdvice { //具體的某個異常型別處理 @ExceptionHandler(MethodArgumentNotValidException.class) public R handleValidException(MethodArgumentNotValidException e){ log.error("資料異常:{},異常型別:{}",e.getMessage(),e.getClass()); BindingResult result = e.getBindingResult(); Map<String, String> map = new HashMap<>(); for (FieldError fieldError : result.getFieldErrors()) { map.put(fieldError.getDefaultMessage(),fieldError.getField()); } return R.error().put("errorMap",map); } //丟擲的所有異常型別處理 @ExceptionHandler(Throwable.class) public R handleException(Throwable e){ //TODO 處理邏輯 return R.error(); } }
package com.zhmsky.common.exception; /** * @author zhmsky * @date 2022/8/1 21:56 */ public enum ErrorCodeEnum { UNKNOWN_EXCEPTION(10000, "系統未知錯誤"), VALID_EXCEPTION(10001, "引數格式校驗失敗"); /** * 錯誤碼 */ private Integer code; /** * 錯誤提示 */ private String msg; ErrorCodeEnum(Integer code, String msg) { this.code = code; this.msg = msg; } public Integer getCode(){ return this.code; } public String getMsg(){ return this.msg; } }
1、編寫自定義校驗註解
參照javax.validation.constraints的@NotBlank註解,
@Documented @Constraint(validatedBy = { }) @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Repeatable(List.class) public @interface NotBlank { //校驗規則提示資訊 String message() default "{javax.validation.constraints.NotBlank.message}"; //分組校驗 Class<?>[] groups() default { }; //負載 Class<? extends Payload>[] payload() default { }; /** * Defines several {@code @NotBlank} constraints on the same element. * * @see NotBlank */ @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) @Retention(RUNTIME) @Documented public @interface List { NotBlank[] value(); } }
模仿上面可快速編寫一個自定義註解:
@Documented @Constraint(validatedBy = {StatusValueConstraintValidator.class}) @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE}) @Retention(RUNTIME) public @interface statusValue { //校驗規則提示資訊(在組態檔中設定) String message() default "{com.zhmsky.common.validator.statusValue.message}"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; //註解引數 int[] values() default {}; }
建立 ValidationMessages.properties 檔案,在組態檔中設定自定義的校驗規則提示資訊:
com.zhmsky.common.validator.statusValue.message=error.......xxxx
2、編寫自定義校驗器
//statusValue就是自定義的註解,Integer就是自定義註解標註的欄位型別 public class StatusValueConstraintValidator implements ConstraintValidator<statusValue, Integer> { private Set<Integer> set = new HashSet<>(); //初始化方法 @Override public void initialize(statusValue constraintAnnotation) { //欄位標註的註解裡面設定的值(校驗規則) int[] values = constraintAnnotation.values(); for (int value : values) { set.add(value); } } //判斷是否校驗成功 @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { //value就是欄位欄位實際接收到的值 return set.contains(value); } }
3、關聯自定義註解和自定義校驗器
也就是在自定義註解的@Constraint註解中指明自定義的校驗器,
4、測試自定義註解@statusValue
@Data @TableName("pms_brand") public class BrandEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 品牌名 */ @NotBlank(message = "品牌名不能為空") private String name; /** * 顯示狀態[0-不顯示;1-顯示],指定欄位值只能為 0 或 1 */ @statusValue(values={0,1}) private Integer showStatus; }
在對應的controller介面中使用@Validated註解來進行校驗,showStatus欄位傳入值3,
測試結果如圖:
到此這篇關於springboot介面引數校驗JSR303的實現的文章就介紹到這了,更多相關springboot介面引數校驗JSR303 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45