Spring中使用JSR303請求約束判空的實現(xiàn)
1. 適用場景
有時候我們在表單里提交一系列參數(shù), 到后臺封裝成一個對象, 要對對象的屬性做各種字段值的約束; 這時候, 當(dāng)然可以if-else一個一個的判斷, 有更簡潔的做法, 就是使用 JSR303+spring的validation:
2. 使用方法步驟(分3步)
- 實體類加字段約束注解
- Controller類中@Valid標(biāo)注啟用(@Validated也兼容@Valid)
- BindingResult獲取報錯信息
2.1 實體類加字段約束注解
如我們要收集前端表單的字段數(shù)據(jù)到Person實體中:
對需要約束的字段進行注解標(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屬性可以修改默認錯誤說明
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請求約束判空的實現(xiàn)的文章就介紹到這了,更多相關(guān)Spring JSR303請求約束判空內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Springboot集成JSR303參數(shù)校驗的方法實現(xiàn)
- Spring Boot利用JSR303實現(xiàn)參數(shù)驗證的方法實例
- SpringBoot結(jié)合JSR303對前端數(shù)據(jù)進行校驗的示例代碼
- SpringBoot使用jsr303校驗的實現(xiàn)
- SpringBoot后端進行數(shù)據(jù)校驗JSR303的使用詳解
- springboot接口參數(shù)校驗JSR303的實現(xiàn)
- springboot整合JSR303參數(shù)校驗與全局異常處理的方法
- springboot整合JSR303校驗功能實現(xiàn)代碼
- SpringMVC中的JSR303與攔截器的使用方法
相關(guān)文章
Mybatis返回int或者Integer類型報錯的解決辦法
這篇文章主要介紹了Mybatis返回int或者Integer類型報錯的解決辦法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-12-12
Spring?多數(shù)據(jù)源方法級別注解實現(xiàn)過程
多數(shù)據(jù)源管理是Spring框架中非常重要的一部分,它可以提高應(yīng)用程序的靈活性和可靠性,從而更好地滿足業(yè)務(wù)需求,這篇文章主要介紹了Spring?多數(shù)據(jù)源方法級別注解實現(xiàn),需要的朋友可以參考下2023-07-07
java中Iterator和ListIterator實例詳解
這篇文章主要介紹了java中Iterator和ListIterator實例詳解,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12
IntelliJ IDEA 2021.1 EAP 1 發(fā)布支持 Java 16 和 WSL 2
這篇文章主要介紹了IntelliJ IDEA 2021.1 EAP 1 發(fā)布支持 Java 16 和 WSL 2,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
SpringAop @Aspect織入不生效,不執(zhí)行前置增強織入@Before方式
這篇文章主要介紹了SpringAop @Aspect織入不生效,不執(zhí)行前置增強織入@Before方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring原生Rpc六種的正確打開方式實現(xiàn)示例
這篇文章主要為大家展示了Spring原生Rpc六種的正確打開方式實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進步早日升職加薪2022-02-02
Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南
這篇文章主要為大家介紹了Spring?Boot實現(xiàn)消息的發(fā)送和接收使用實戰(zhàn)指南,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06

