Spring中使用JSR303請求約束判空的實(shí)現(xiàn)
1. 適用場景
有時候我們在表單里提交一系列參數(shù), 到后臺封裝成一個對象, 要對對象的屬性做各種字段值的約束; 這時候, 當(dāng)然可以if-else一個一個的判斷, 有更簡潔的做法, 就是使用 JSR303+spring的validation:
2. 使用方法步驟(分3步)
- 實(shí)體類加字段約束注解
- Controller類中@Valid標(biāo)注啟用(@Validated也兼容@Valid)
- BindingResult獲取報錯信息
2.1 實(shí)體類加字段約束注解
如我們要收集前端表單的字段數(shù)據(jù)到Person實(shí)體中:
對需要約束的字段進(jìn)行注解標(biāo)注;
示例:
2.1.1 Person.java
package com.niewj.demo.model; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.URL; import javax.validation.constraints.*; import java.util.List; @Data public class Person { @Length(min = 4, max = 10) @NotNull(message = "name不能為空") private String name; @Min(0) @Max(40) @NotNull(message = "age不能為空") private Integer age; @NotBlank @NotBlank @URL(message = "logo必須是URL格式") private String logo; @NotEmpty(message = "hobbies不能為空") private List<String> hobbies; @Email @NotNull(message = "email不能為空!") private String mail; }
@NotNull 約束字段不可為空;
@NotEmpty 約束集合/map等不能為空不能為0元素
@Email 約束是 email格式
@URL 約束必須是url的格式
message屬性可以修改默認(rèn)錯誤說明
2.2 Controller類中@Valid標(biāo)注啟用(@Validated兼容@Valid)
2.2.1 HelloController.java
package com.niewj.demo.controller; import com.google.gson.Gson; import com.niewj.demo.common.Result; import com.niewj.demo.model.Person; import com.niewj.demo.service.TestService1; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.HashMap; import java.util.Map; /** * test * * @author niewj * @since 2020/11/16 15:22 */ @Controller public class HelloController { /** * @param person * @param bindingResult * @return */ @PostMapping("/test") @ResponseBody public Result doSth(@Valid @RequestBody Person person, BindingResult bindingResult) { Map<String, String> map = new HashMap<>(); if (bindingResult.hasErrors()) { bindingResult.getFieldErrors().stream().forEach(fe-> map.put(fe.getField(), fe.getDefaultMessage())); System.out.println(bindingResult.getFieldError().getDefaultMessage()); return Result.withErrorParamData(map); } return Result.withSuccessData(person); } }
@RequestBody可以將body中的請求流信息(Request.getInputStream)通過HttpMessageConverter自動轉(zhuǎn)換為目標(biāo)java類型:
- 如果前端 Content-Type為application/json, 就使用 JSON消息轉(zhuǎn)換器 幫你轉(zhuǎn)為JSON對象;
- 如果前端 Content-Type為application/xml, 就使用 XML消息轉(zhuǎn)換器 幫你轉(zhuǎn)為xml;
- 如果前端 Content-Type為text/plain, 就是用 String消息轉(zhuǎn)換器 幫你轉(zhuǎn)成 String; (只有類型為String時才可以轉(zhuǎn)換)
2.2.2 Result.java:
package com.niewj.demo.common; import lombok.Data; import java.io.Serializable; import java.util.Map; /** * 返回結(jié)果模板封裝 * * @author niewj * @since 2020/12/17 18:05 */ @Data public class Result<T> implements Serializable { private int code; private String msg; private T data; public Result(int code, String msg, T data) { this(code, msg); this.data = data; } public Result(int code, String msg) { this.msg = msg; this.code = code; } public static <T> Result<T> withData(ResponseEnum responseCode, T data) { Result<T> re = new Result(responseCode.getCode(), responseCode.getMsg()); re.data = data; return re; } public static Result<String> withSuccessNoData() { Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg()); re.data = ""; return re; } public static <T> Result<T> withSuccessData(T data) { Result re = new Result(ResponseEnum.SUCCESS.getCode(), ResponseEnum.SUCCESS.getMsg()); re.data = data; return re; } public static Result<Map<String, String>> withErrorParamData(Map<String, String> data) { Result re = new Result(ResponseEnum.BAD_REQUEST.getCode(), ResponseEnum.BAD_REQUEST.getMsg()); re.data = data; return re; } }
2.2.3 ResponseEnum.java
package com.niewj.demo.common; /** * 通用響應(yīng)碼 */ public enum ResponseEnum { SUCCESS(200, "成功"), BAD_REQUEST(400, "請求參數(shù)不合規(guī)"); /** * 錯誤碼 */ private Integer code; /** * 錯誤信息 */ private String msg; ResponseEnum(Integer code, String msg) { this.code = code; this.msg = msg; } public String getMsg() { return msg; } public Integer getCode() { return code; } }
2.3 BindingResult獲取報錯信息
- BindingResult用來收集約束字段的錯誤信息, 可通過 bindingResult.hasErrors()的 true來過濾錯誤信息;
- bindingResult.getFieldErrors() 會返回 List<FieldError>;
- FieldError 得到字段名: getField(); 得到錯誤信息: getDefaultMessage()
3. 調(diào)用測試:
http://localhost:8888/test
3.1 請求用例1: 字段為空
header: Content-Type: application/json
{ "name": "1" }
響應(yīng):
{ "code": 400, "msg": "請求參數(shù)不合規(guī)", "data": { "mail": "email不能為空!", "hobbies": "hobbies不能為空", "name": "長度需要在4和10之間", "logo": "不能為空", "age": "age不能為空" } }
3.2 請求用例2: list無元素/email/url格式不對
header: Content-Type: application/json
{ "name": "1234", "hobbies": [], "mail": "niewj", "logo": "niewj.com" }
響應(yīng):
{ "code": 400, "msg": "請求參數(shù)不合規(guī)", "data": { "mail": "不是一個合法的電子郵件地址", "hobbies": "hobbies不能為空", "logo": "logo必須是URL格式", "age": "age不能為空" } }
3.3 請求用例3: 完整字段信息
header: Content-Type: application/json
{ "name": "1234", "hobbies": ["running"], "mail": "hi@niewj.com", "logo": "http://niewj.com", "age": 40 }
響應(yīng):
{ "code": 200, "msg": "成功", "data": { "name": "1234", "age": 40, "logo": "http://niewj.com", "hobbies": [ "running" ], "mail": "hi@niewj.com" } }
到此這篇關(guān)于Spring中使用JSR303請求約束判空的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring JSR303請求約束判空內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot集成JSR303參數(shù)校驗(yàn)的方法實(shí)現(xiàn)
- Spring Boot利用JSR303實(shí)現(xiàn)參數(shù)驗(yàn)證的方法實(shí)例
- SpringBoot結(jié)合JSR303對前端數(shù)據(jù)進(jìn)行校驗(yàn)的示例代碼
- SpringBoot使用jsr303校驗(yàn)的實(shí)現(xiàn)
- SpringBoot后端進(jìn)行數(shù)據(jù)校驗(yàn)JSR303的使用詳解
- springboot接口參數(shù)校驗(yàn)JSR303的實(shí)現(xiàn)
- springboot整合JSR303參數(shù)校驗(yàn)與全局異常處理的方法
- springboot整合JSR303校驗(yàn)功能實(shí)現(xiàn)代碼
- SpringMVC中的JSR303與攔截器的使用方法
相關(guān)文章
java實(shí)現(xiàn)Object轉(zhuǎn)String的4種方法小結(jié)
這篇文章主要介紹了java實(shí)現(xiàn)Object轉(zhuǎn)String的4種方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09解決程序包org.springframework.test.context不存在
這篇文章主要介紹了解決程序包org.springframework.test.context不存在的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09java 計算中位數(shù)的實(shí)現(xiàn)方法
這篇文章主要介紹了java 計算中位數(shù)的實(shí)現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Mybatis控制臺打印SQL語句的兩種方式實(shí)現(xiàn)
這篇文章主要介紹了Mybatis控制臺打印SQL語句的兩種方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔
這篇文章主要介紹了詳解SpringBoot結(jié)合swagger2快速生成簡單的接口文檔,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05java利用正則表達(dá)式處理特殊字符的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于java利用正則表達(dá)式處理特殊字符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Java14對于NullPointerException的新處理方式示例解析
這篇文章主要為大家介紹了Java14對于NullPointerException的新處理方式示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09SpringBoot打印POST請求原始入?yún)ody體方式
這篇文章主要介紹了SpringBoot打印POST請求原始入?yún)ody體方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09