成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot接口參數統一校驗

開發 架構
在進行單個參數校驗時,一定要在Controler類上加@Validated注解,否則校驗不會生效。

SpringBoot檢驗注解

@Null 限制只能為null。

@NotNull 限制必須不為null。

@NotEmpty 只作用于字符串類型,字符串不為空,并且長度不為0。

@NotBlank 只作用于字符串類型,字符串不為空,并且trim()后不為空串。

@AssertFalse 限制必須為false。

@AssertTrue 限制必須為true。

@DecimalMax(value) 限制必須為一個不大于指定值的數字。

@DecimalMin(value) 限制必須為一個不小于指定值的數字。

@Digits(integer,fraction) 限制必須為一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction。

@Future 限制必須是一個將來的日期。

@Past 驗證注解的元素值(日期類型)比當前時間早。

@Max(value) 限制必須為一個不大于指定值的數字。

@Min(value) 限制必須為一個不小于指定值的數字。

@Pattern(value) 限制必須符合指定的正則表達式。

@Size(max,min) 限制字符長度必須在min到max之間。

@Email 驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式。

注意:

@NotNull 適用于任何類型被注解的元素必須不能與NULL。

@NotEmpty 適用于String Map或者數組不能為Null且長度必須大于0。

@NotBlank 只能用于String上面 不能為null,調用trim()后,長度必須大于0。

單個參數校驗

@RestController
@RequestMapping("validator/")
@Validated
public class ValidatorController {
@GetMapping("/add")
public String add(@NotNull(message = "address不能為空") String address) {
return "檢驗通過";
}
}

請求:127.0.0.1:8080/validator/add?address=中國。

返回:檢驗通過。

請求:127.0.0.1:8080/validator/add。

返回:address不能為空。

說明:在進行單個參數校驗時,一定要在Controler類上加@Validated注解,否則校驗不會生效。

實體類參數校驗

實體User類:

public class User {
@NotBlank(message = "請輸入名稱")
@Length(message = "名稱不能超過個 {max} 字符", max = 5)
public String name;

@NotNull(message = "請輸入年齡")
@Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100)
public Integer age;

public String getName() {return name;}
public void setName(String name) {this.name = name;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
}

controller類:

@RestController
@RequestMapping("validator/")
public class ValidatorController {
@PostMapping("/add")
public String addUser(@RequestBody @Valid User user, BindingResult bindingResult) {
//查看所有字段是否驗證通過
if (bindingResult.hasErrors()) {
//返回第一條錯誤信息
return bindingResult.getAllErrors().get(0).getDefaultMessage();
}
return "檢驗通過";
}
}

執行如下:

說明:如果采用BindingResult方式來存儲異常結果,就必須自己來處理異常。即接口中有BindingResult參數,就必須使用要有上方7,8,9行代碼進行異常處理,否則程序會正常執行。

統一異常管理

實體User類,同上。controller類如下:

@RequestMapping("validator/")
public class ValidatorController {
@PostMapping("/add")
public String addUser(@Valid @RequestBody User user) {
return "檢驗通過";
}
}

執行結果:

這里沒有采用BindingResult來存儲異常,程序在這里會報錯。可以在這個地方增加統一異常管理。通過報錯信息可以知道需要對MethodArgumentNotValidException進行管理,代碼如下:

@RestControllerAdvice
public class ValidatedExceptionHander {
@ExceptionHandler(MethodArgumentNotValidException.class)
public String MethodArgumentNotValidHandler(MethodArgumentNotValidException exception) {
String exceptionInfo = exception.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return exceptionInfo;
}
}

再次執行:

使用spring boot校驗器

檢驗器代碼:

@Component
public class ValidatorUtil implements ApplicationContextAware {
// 通過Spring獲得校驗器
private static Validator validator;

@Override
public void setApplicationContext(ApplicationContext applicationContext){
Validator validatorBean = applicationContext.getBean(Validator.class);
setValidator(validatorBean);
}

public static void setValidator(Validator validatorBean){
if (validatorBean instanceof LocalValidatorFactoryBean) {
validator = ((LocalValidatorFactoryBean) validatorBean).getValidator();
} else if (validatorBean instanceof SpringValidatorAdapter) {
validator = validatorBean.unwrap(Validator.class);
} else {
validator = validatorBean;
}
}

public static <T> void validate(T object){
Set<ConstraintViolation<T>> violationSet = validator.validate(object);
for (ConstraintViolation<T> violation : violationSet) {
throw new ValidationException(violation.getMessage());
}
}
}

統一異常管理:

@RestControllerAdvice
public class ValidatedExceptionHander {
@ExceptionHandler(value = ValidationException.class)
public String ValidationException(ValidationException exception) {
return exception.getMessage();
}
}

controller類如下:

@RestController
@RequestMapping("validator/")
public class ValidatorController {
@PostMapping("/add")
public String addUser(@RequestBody User user) {
ValidatorUtil.validate(user);
return "檢驗通過";
}
}

執行如下:

說明:這么做的好處是可以自由的對實體進行檢驗,與以上方式相比較為靈活。

分組校驗

同一個實體在不同的操作中的校驗方式是不同的,這就要用到分組校驗。比如實體User在新增操作時,id是沒有的,但是在更新操作時id又必須存在。通過下面例子來講解一下是如何實現的。

實體user:

public class User {
@NotNull(message = "id不能為空", groups = {User.UpdateGroup.class})
@Null(message = "id必須為空", groups = {User.InsertGroup.class})
public Integer id;

@NotBlank(message = "請輸入名稱")
@Length(message = "名稱不能超過個 {max} 字符", max = 5)
public String name;

@NotNull(message = "請輸入年齡")
@Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100)
public Integer age;

public Integer getId() {return id;}
public void setId(Integer id) {this.id = id;}
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}

public interface InsertGroup{}
public interface UpdateGroup{}
}

統一異常:

@RestControllerAdvice
public class ValidatedExceptionHander {
@ExceptionHandler(MethodArgumentNotValidException.class)
public String MethodArgumentNotValidHandler(MethodArgumentNotValidException exception) {
String exceptionInfo = exception.getBindingResult().getAllErrors().get(0).getDefaultMessage();
return exceptionInfo;
}
}

controller類:

@RestController
@RequestMapping("validator/")
public class ValidatorController {
@GetMapping("/update")
public String updateUser(@Validated(User.UpdateGroup.class) @RequestBody User user) {
return "更新成功";
}
@GetMapping("/insert")
public String insertUser(@Validated(User.InsertGroup.class) @RequestBody User user) {
return "保存成功";
}
}

執行如下:

@Validated和@Valid區別

@Validated 對@Valid 進行了二次封裝,但在分組、注解位置、嵌套驗證等功能上有所不同。

不同點

@Valid

@Validated

來源

是Hibernate validation 的 校驗注解

是 Spring Validator 的校驗注解,是 Hibernate validation 基礎上的增加版

注解位置

用在 構造函數、方法、方法參數 和 成員屬性上

用在 類、方法和方法參數上。但不能用于成員屬性

嵌套驗證

用在級聯對象的成員屬性上面

不支持

分組

無此功能

提供分組功能,可以在入參驗證時,根據不同的分組采用不同的驗證機制

責任編輯:姜華 來源: 今日頭條
相關推薦

2023-03-16 08:23:33

2022-05-30 08:03:06

后端參數校驗異常處理

2023-11-08 13:33:00

AOP技術信息

2020-02-04 18:42:53

充電接口歐盟蘋果

2011-07-19 14:38:06

jQuery Mobi

2021-05-18 09:25:54

SpringBoot參數校驗

2023-11-29 07:23:04

參數springboto

2024-05-29 08:12:55

接口參數格式

2022-05-03 10:43:43

SpringJava

2024-10-28 08:32:22

統一接口響應SpringBoot響應框架

2024-06-13 08:19:08

Controller接口參數

2024-08-01 09:10:03

2021-08-12 10:32:50

Spring Boot參數校驗分組校驗

2021-08-10 15:11:27

Spring Boot參數校驗

2022-05-07 10:09:01

開發Java日志

2021-11-10 10:03:18

SpringBootJava代碼

2019-09-29 10:23:09

APIJava編程語言

2020-03-10 13:13:15

程序員接口參數編程語言

2015-01-27 13:22:55

接口交換機

2022-03-28 14:23:26

HarmonyAI算法統一推理接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 爱操影视 | 日本成人免费网站 | 精品国产一区二区三区久久久蜜月 | 日韩欧美网 | 在线看亚洲 | 亚洲一区久久久 | 91视频在线看 | 国产精品美女久久久久久免费 | 伊人艹| www.亚洲一区二区三区 | 性高湖久久久久久久久 | 精品一区二区三区视频在线观看 | 鲁大师一区影视 | 欧美日韩电影一区 | 欧美一级二级在线观看 | 秋霞在线一区二区 | 九九久久久| 亚洲在线免费 | 国产成人麻豆免费观看 | 国产精品日日摸夜夜添夜夜av | 久久91精品国产 | 福利视频一区二区 | 免费午夜视频 | 精品国产欧美一区二区 | 韩日一区 | 亚洲美女一区二区三区 | 一级在线视频 | 一区二区三区 在线 | 久草.com | 久久91精品国产一区二区三区 | 久久精品99| 一区二区三区免费 | 久久久www成人免费无遮挡大片 | 国产精品视频在线免费观看 | www.蜜桃av.com| 一级黄色大片 | 欧美成年人 | 狠狠久| 精品一区二区在线观看 | 亚洲一区二区视频 | 国产精品久久二区 |