最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot + validation 接口參數(shù)校驗的思路詳解

 更新時間:2020年10月22日 10:51:08   作者:乾源  
這篇文章主要介紹了SpringBoot + validation 接口參數(shù)校驗,本文通過項目實踐+場景分析給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

        有參數(shù)傳遞的地方都少不了參數(shù)校驗。在web開發(fā)中,前端的參數(shù)校驗是為了用戶體驗,后端的參數(shù)校驗是為了安全。試想一下,如果在controller層中沒有經(jīng)過任何校驗的參數(shù)通過service層、dao層一路來到了數(shù)據(jù)庫就可能導(dǎo)致嚴(yán)重的后果,最好的結(jié)果是查不出數(shù)據(jù),嚴(yán)重一點就是報錯,如果這些沒有被校驗的參數(shù)中包含了惡意代碼,那就可能導(dǎo)致更嚴(yán)重的后果。

實踐

一、引入依賴

<!--引入spring-boot-starter-validation-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

二、使用校驗

在controller層的參數(shù)校驗可以分為兩種場景:

單個參數(shù)校驗
實體類參數(shù)校驗

2.1 單參數(shù)校驗

/**
 * 參數(shù)校驗測試 控制類
 * @author oyc
 */
@RestController
@RequestMapping("user")
@Validated
public class RequestParamsValidatedController {
 
 private Logger logger = LoggerFactory.getLogger(this.getClass());
 
 @GetMapping
 public User test(@NotNull(message = "姓名不能為空") String name,
      @NotNull(message = "年齡不能為空") @Max(value = 99, message = "不能大于200歲") Integer age) {
  logger.info("name:" + name + " -age:" + age);
  return new User(name, age);
 }
}

2.2 實體類參數(shù)校驗

/**
 * 參數(shù)校驗測試 控制類
 * @author oyc
 */
@RestController
@RequestMapping("user")
@Validated
public class RequestParamsValidatedController {
 
 private Logger logger = LoggerFactory.getLogger(this.getClass());
 
 @PostMapping
 public User save(@Validated User user) {
  logger.info(user.toString());
  return user;
 }
}
package com.oycbest.springbootvalidated.vo;
 
 
import javax.validation.constraints.*;
import java.io.Serializable;
 
/**
 * 用戶實體類
 * @author oyc
 */
public class User implements Serializable {
 private String userId;
 
 @NotNull(message = "用戶名不能為空")
 private String userName;
 
 @NotNull(message = "年齡不能為空")
 @Max(value = 100, message = "年齡不能大于100歲")
 private int age;
 
 @NotNull(message = "郵箱不能為空")
 @Email(message = "郵箱格式不正確")
 private String email;
 
 @NotNull(message = "電話號碼不能為空")
 private String phoneNumber;
 
 public User(@NotNull(message = "用戶名不能為空") String userName, int age) {
  this.userName = userName;
  this.age = age;
 }
 
 public User() {
 }
 
 public User(String userId, @NotNull(message = "用戶名不能為空") String userName, int age, String email, String phoneNumber) {
  this.userId = userId;
  this.userName = userName;
  this.age = age;
  this.email = email;
  this.phoneNumber = phoneNumber;
 }
 
 public String getUserId() {
  return userId;
 }
 
 public void setUserId(String userId) {
  this.userId = userId;
 }
 
 public String getUserName() {
  return userName;
 }
 
 public void setUserName(String userName) {
  this.userName = userName;
 }
 
 public int getAge() {
  return age;
 }
 
 public void setAge(int age) {
  this.age = age;
 }
 
 public String getEmail() {
  return email;
 }
 
 public void setEmail(String email) {
  this.email = email;
 }
 
 public String getPhoneNumber() {
  return phoneNumber;
 }
 
 public void setPhoneNumber(String phoneNumber) {
  this.phoneNumber = phoneNumber;
 }
 
 @Override
 public String toString() {
  return "User{" +
    "userId='" + userId + '\'' +
    ", userName='" + userName + '\'' +
    ", age=" + age +
    ", email='" + email + '\'' +
    ", phoneNumber='" + phoneNumber + '\'' +
    '}';
 }
}

2.3 定義統(tǒng)一異常處理

package com.oycbest.springbootvalidated.exception;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.validation.beanvalidation.MethodValidationPostProcessor;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
 
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;
import java.util.List;
import java.util.Set;
 
/**
 * 全局異常處理
 *
 * @author oyc
 */
@ControllerAdvice
@Component
public class GlobalExceptionHandler {
 private Logger logger = LoggerFactory.getLogger(this.getClass());
 
 @Bean
 public MethodValidationPostProcessor methodValidationPostProcessor() {
  return new MethodValidationPostProcessor();
 }
 
 @ExceptionHandler
 @ResponseBody
 @ResponseStatus(HttpStatus.BAD_REQUEST)
 public String handle(ValidationException exception) {
  logger.error("請求異常:" + exception.getMessage());
  if (exception instanceof ConstraintViolationException) {
   ConstraintViolationException exs = (ConstraintViolationException) exception;
 
   Set<ConstraintViolation<?>> violations = exs.getConstraintViolations();
   for (ConstraintViolation<?> item : violations) {
    //打印驗證不通過的信息
    logger.error("請求異常:" + item.getMessage());
   }
  }
  return "請求異常: " + exception.getMessage();
 }
 
 @ResponseBody
 @ExceptionHandler(value = BindException.class)
 public String bindException(Exception e) {
  if (e instanceof BindException) {
   BindException exs = (BindException) e;
   List<FieldError> fieldErrors = exs.getFieldErrors();
   for (FieldError item : fieldErrors) {
    logger.error("請求異常:" + item.getDefaultMessage());
   }
  }
  logger.error("數(shù)據(jù)綁定異常:" + e.getMessage());
  return "數(shù)據(jù)綁定異常";
 }
 
 @ResponseBody
 @ExceptionHandler(value = Exception.class)
 public String defaultException(Exception e) {
  logger.error("請求異常:" + e.getMessage());
  return "請求異常 " + e.getMessage();
 }
 
}

三、約束性注解(簡單)說明

注解

功能

@AssertFalse

可以為null,如果不為null的話必須為false

@AssertTrue

可以為null,如果不為null的話必須為true

@DecimalMax

設(shè)置不能超過最大值

@DecimalMin

設(shè)置不能超過最小值

@Digits

設(shè)置必須是數(shù)字且數(shù)字整數(shù)的位數(shù)和小數(shù)的位數(shù)必須在指定范圍內(nèi)

@Future

日期必須在當(dāng)前日期的未來

@Past

日期必須在當(dāng)前日期的過去

@Max

最大不得超過此最大值

@Min

最大不得小于此最小值

@NotNull

不能為null,可以是空

@Null

必須為null

@Pattern

必須滿足指定的正則表達(dá)式

@Size

集合、數(shù)組、map等的size()值必須在指定范圍內(nèi)

@Email

必須是email格式

@Length

長度必須在指定范圍內(nèi)

@NotBlank

字符串不能為null,字符串trim()后也不能等于“”

@NotEmpty

不能為null,集合、數(shù)組、map等size()不能為0;字符串trim()后可以等于“”

@Range

值必須在指定范圍內(nèi)

@URL

必須是一個URL

到此這篇關(guān)于SpringBoot + validation 接口參數(shù)校驗的文章就介紹到這了,更多相關(guān)SpringBoot + validation 接口參數(shù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 反射機制詳解及實例代碼

    java 反射機制詳解及實例代碼

    這篇文章主要介紹了java 反射機制詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • Java實現(xiàn)List去重的幾種方法總結(jié)

    Java實現(xiàn)List去重的幾種方法總結(jié)

    這篇文章主要為大家詳細(xì)介紹了Java中List去重的幾種常用方法總結(jié),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)和參考價值,需要的小伙伴可以了解一下
    2023-09-09
  • 如何用java給一個文件夾打成壓縮包(附代碼)

    如何用java給一個文件夾打成壓縮包(附代碼)

    項目中需要將文件夾打包成壓縮包下載,所以下面這篇文章主要給大家介紹了關(guān)于如何用java給一個文件夾打成壓縮包的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-10-10
  • 使用logback實現(xiàn)按自己的需求打印日志到自定義的文件里

    使用logback實現(xiàn)按自己的需求打印日志到自定義的文件里

    這篇文章主要介紹了使用logback實現(xiàn)按自己的需求打印日志到自定義的文件里,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 基于java+springboot+mybatis+laiyu實現(xiàn)學(xué)科競賽管理系統(tǒng)

    基于java+springboot+mybatis+laiyu實現(xiàn)學(xué)科競賽管理系統(tǒng)

    這篇文章主要介紹了基于java+springboot+mybatis+laiyu實現(xiàn)的學(xué)科競賽管理系統(tǒng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Spring?Boot?4.0對于Java開發(fā)的影響和前景

    Spring?Boot?4.0對于Java開發(fā)的影響和前景

    探索Spring?Boot?4.0如何徹底革新Java開發(fā),提升效率并開拓未來可能性!別錯過這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強大魅力和潛力,準(zhǔn)備好了嗎?
    2024-02-02
  • IDEA 工程里 new不出來Vue文件的圖文解決方案

    IDEA 工程里 new不出來Vue文件的圖文解決方案

    這篇文章主要介紹了IDEA 工程里 new不出來Vue文件的解決方案,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java基于深度優(yōu)先遍歷的隨機迷宮生成算法

    Java基于深度優(yōu)先遍歷的隨機迷宮生成算法

    今天小編就為大家分享一篇關(guān)于Java基于深度優(yōu)先遍歷的隨機迷宮生成算法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02
  • maven中no main manifest attribute的問題解決

    maven中no main manifest attribute的問題解決

    本文主要介紹了maven中no main manifest attribute的問題解決,這個錯誤通常意味著Spring Boot應(yīng)用在啟動時遇到了問題,下面就來具體介紹一下,感興趣的可以了解一下
    2024-08-08
  • Java CountDownLatch的源碼硬核解析

    Java CountDownLatch的源碼硬核解析

    對于并發(fā)執(zhí)行,Java中的CountDownLatch是一個重要的類。為了更好的理解CountDownLatch這個類,本文將通過例子和源碼帶領(lǐng)大家深入解析這個類的原理,感興趣的可以學(xué)習(xí)一下
    2022-10-10

最新評論

乐业县| 上饶县| 扎囊县| 大埔区| 吐鲁番市| 芮城县| 绥棱县| 如东县| 浦县| 定边县| 丘北县| 海口市| 富宁县| 广元市| 吉首市| 开化县| 河津市| 奇台县| 元江| 伽师县| 高邑县| 丰都县| 潜山县| 巢湖市| 武定县| 三河市| 慈利县| 香港 | 平邑县| 聂荣县| 菏泽市| 盐池县| 怀集县| 榕江县| 新民市| 武穴市| 茂名市| 云林县| 台东市| 佛学| 铁力市|