使用javax.validation.constraints對請求體進行統(tǒng)一校驗
一、序言
在處理請求的時候,通常需要對參數(shù)進行校驗是否為空,參數(shù)的長度等進行校驗,
如果在controller層一個一個的寫校驗就很麻煩,于是就有了javax.validation.constraints包。
二、注解類型
不同的注解用于不同的數(shù)據(jù)類型,小伙伴們可以下載源碼看一些常用的比如非空限制的注解的區(qū)別,
我這里截幾個圖:
所以我一般的處理是,如果是字符串類型就用@NotBlank,
如果是集合數(shù)組之類就用@NotEmpty,如果是對象就用@NotNull
當(dāng)然還有別的包的校驗類型,比如限制請求參數(shù)的長度就可以用到另外一個包里的注解了,在pom中增加依賴:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> <scope>compile</scope> </dependency>
三、使用注解
3.1 請求實體類增加注解
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @author FanHuiFang * @version 1.0 * @date 2024年04月27日 19:58 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class UserSaveReq { @NotBlank(message = "name不能為空") private String name; @NotNull(message = "年齡不能為空") private Long age; @NotEmpty(message = "朋友列表不能為空") private List<String> friends; @NotNull(message = "客戶手機號不能為空") @Length(min = 8, max = 16, message = "客戶手機號不合法") private String userPhone; }
3.2 控制層
import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import org.springframework.validation.Errors; @PostMapping(value = "/saveUser") public ResultBean<String> saveUser(@Valid @RequestBody UserSaveReq req, Errors errors) { if (Objects.isNull(req)) return ResultBean.fail("缺少必要的請求參數(shù)"); if (errors.hasErrors() && Objects.nonNull(errors.getFieldError())) { String errorMessage = errors.getFieldError().getDefaultMessage(); log.error("保存用戶信息時請求參數(shù)錯誤:{}", errorMessage); return ResultBean.fail(errorMessage); } //保存處理...... }
當(dāng)進行請求的時候,如果缺少某個參數(shù),或者比如長度不對,就會返回異常信息,這樣就不用一個個的進行校驗了。
注意:這里請求參數(shù)中需要加上@Valid注解,如果不加,應(yīng)該是校驗沒有生效的
比如手機號號長度不對,就會返回
{ "code": 0, "message": "客戶手機號不合法", "data": null }
這里也附帶一下我用的ResultBean,以免看的云里霧里的:
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.ToString; import java.io.Serializable; /** * @author FanHuiFang * @version 1.0 * @date 2024年04月27日 21:50 */ @Builder @Data @AllArgsConstructor @ToString public class ResultBean<T> implements Serializable { private Integer code; private String message; private T data; public ResultBean(int code, String message, T data) { this.code = code; this.data = data; this.message = message; } public ResultBean(Integer code, String message) { this.code = code; this.message = message; } public static <T> ResultBean<T> data(T data) { return data("操作成功", data); } public static <T> ResultBean<T> data(String message, T data) { return data(1, message, data); } public static <T> ResultBean<T> data(int code, String message, T data) { return new ResultBean<>(code, message, data); } public static <T> ResultBean<T> fail(String message, T data) { return new ResultBean<>(0, message, data); } public static <T> ResultBean<T> fail(Integer code, String message) { return new ResultBean<>(code, message); } public static <T> ResultBean<T> fail(String message) { return new ResultBean<>(0, message, null); } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb請求轉(zhuǎn)發(fā)和請求包含實現(xiàn)過程解析
這篇文章主要介紹了JavaWeb請求轉(zhuǎn)發(fā)和請求包含實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-02-02深度deepin安裝以及jdk、tomcat、Nginx安裝教程
這篇文章主要給大家介紹了關(guān)于深度deepin安裝以及jdk、tomcat、Nginx安裝的相關(guān)資料,按照文中介紹的方法可以輕松的實現(xiàn)安裝,對大家的工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01Java?HashTable與Collections.synchronizedMap源碼深入解析
HashTable是jdk?1.0中引入的產(chǎn)物,基本上現(xiàn)在很少使用了,但是會在面試中經(jīng)常被問到。本文就來帶大家一起深入了解一下Hashtable,需要的可以參考一下2022-11-11SpringBoot 監(jiān)聽Redis鍵過期事件(過期監(jiān)聽)
Redis鍵過期事件是SpringBoot中常用的緩存失效通知方式,通過配置可以監(jiān)聽特定鍵的過期事件,具有一定的參考價值,感興趣的可以了解一下2024-12-12mybatis-plus查詢無數(shù)據(jù)問題及解決
這篇文章主要介紹了mybatis-plus查詢無數(shù)據(jù)問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12Sonar編譯問題對應(yīng):File [...] can''t be indexed twice.
今天小編就為大家分享一篇關(guān)于Sonar編譯問題對應(yīng):File [...] can't be indexed twice.,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12