使用javax.validation.constraints對請求體進(jìn)行統(tǒng)一校驗(yàn)
一、序言
在處理請求的時(shí)候,通常需要對參數(shù)進(jìn)行校驗(yàn)是否為空,參數(shù)的長度等進(jìn)行校驗(yàn),
如果在controller層一個(gè)一個(gè)的寫校驗(yàn)就很麻煩,于是就有了javax.validation.constraints包。
二、注解類型
不同的注解用于不同的數(shù)據(jù)類型,小伙伴們可以下載源碼看一些常用的比如非空限制的注解的區(qū)別,
我這里截幾個(gè)圖:
所以我一般的處理是,如果是字符串類型就用@NotBlank,
如果是集合數(shù)組之類就用@NotEmpty,如果是對象就用@NotNull
當(dāng)然還有別的包的校驗(yàn)類型,比如限制請求參數(shù)的長度就可以用到另外一個(gè)包里的注解了,在pom中增加依賴:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> <scope>compile</scope> </dependency>
三、使用注解
3.1 請求實(shí)體類增加注解
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 = "客戶手機(jī)號不能為空") @Length(min = 8, max = 16, message = "客戶手機(jī)號不合法") 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í)請求參數(shù)錯(cuò)誤:{}", errorMessage); return ResultBean.fail(errorMessage); } //保存處理...... }
當(dāng)進(jìn)行請求的時(shí)候,如果缺少某個(gè)參數(shù),或者比如長度不對,就會返回異常信息,這樣就不用一個(gè)個(gè)的進(jìn)行校驗(yàn)了。
注意:這里請求參數(shù)中需要加上@Valid注解,如果不加,應(yīng)該是校驗(yàn)沒有生效的
比如手機(jī)號號長度不對,就會返回
{ "code": 0, "message": "客戶手機(jī)號不合法", "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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java實(shí)現(xiàn)超市會員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)超市會員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java微信公眾平臺開發(fā)(11) 微信三大平臺的關(guān)聯(lián)
這篇文章主要介紹了Java微信公眾平臺開發(fā)第十一步,微信開發(fā)中微信公眾平臺、開放平臺和商戶平臺的關(guān)聯(lián),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04MyBatis開啟二級緩存實(shí)現(xiàn)過程解析
這篇文章主要介紹了MyBatis開啟二級緩存實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07MyBatis攔截器動(dòng)態(tài)替換表名的方法詳解
因?yàn)槲覀兂志脤涌蚣芨嗟厥褂肕yBatis,那我們就借助于MyBatis的攔截器來完成我們的功能,這篇文章主要給大家介紹了關(guān)于MyBatis攔截器動(dòng)態(tài)替換表名的相關(guān)資料,需要的朋友可以參考下2022-04-04