欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解SpringBoot中的參數(shù)校驗(yàn)(項(xiàng)目實(shí)戰(zhàn))

 更新時(shí)間:2020年07月29日 09:18:52   作者:yese777  
這篇文章主要介紹了SpringBoot中的參數(shù)校驗(yàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Java后端發(fā)工作中經(jīng)常會(huì)對(duì)前端傳遞過(guò)來(lái)的參數(shù)做一些校驗(yàn),在業(yè)務(wù)中還要拋出異?;蛘卟粩嗟姆祷禺惓r(shí)的校驗(yàn)信息,充滿了if-else這種校驗(yàn)代碼,在代碼中相當(dāng)冗長(zhǎng)。例如說(shuō),用戶注冊(cè)時(shí),會(huì)校驗(yàn)手機(jī)格式的正確性,用戶名的長(zhǎng)度等等。雖說(shuō)前端也可以做參數(shù)校驗(yàn),但是為了保證我們API接口的可靠性,以保證最終數(shù)據(jù)入庫(kù)的正確性,后端進(jìn)行參數(shù)校驗(yàn)不可忽視。 Hibernate Validator 提供了一種統(tǒng)一方便的方式,讓我們快速的實(shí)現(xiàn)參數(shù)校驗(yàn)。

Hibernate Validator 使用注解,實(shí)現(xiàn)聲明式校驗(yàn)。而在實(shí)現(xiàn)原理上,也是基于 Spring AOP 攔截,實(shí)現(xiàn)校驗(yàn)相關(guān)的操作。 javax.validation.constraints 包下,定義了一系列的約束( constraint )注解。文末會(huì)貼上一些常用的注解。 如果項(xiàng)目的框架是 spring boot 的話,在 spring-boot-starter-web 中已經(jīng)包含了 Hibernate-validator 的依賴( 版本<2.3 )。 2.3 以后的版本中 spring-boot-starter-web 已經(jīng)去除了這個(gè)依賴,需要手動(dòng)引入 Hibernate-validator 依賴,并且有一些變化,因此 2.3.x 的版本暫不研究。本文使用的版本是 2.2.8

實(shí)戰(zhàn)

1、創(chuàng)建實(shí)體類

package com.yese.pojo;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.*;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
 /**
 * 用戶ID
 */
 @NotNull(message = "用戶id不能為空")
 private Long userId;

 /**
 * 用戶名
 */
 @NotBlank(message = "用戶名不能為空")
 @Length(max = 20, message = "用戶名不能超過(guò)10個(gè)字符")
 @Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9\\*]*$", message = "用戶名限制:最多10字符,包含文字、字母和數(shù)字")
 private String username;

 /**
 * 密碼
 */
 @NotBlank(message = "密碼不能為空")
 private String password;

 /**
 * 手機(jī)號(hào)
 */
 @NotBlank(message = "手機(jī)號(hào)不能為空")
 @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}$", message = "手機(jī)號(hào)格式有誤")
 private String mobile;

 /**
 * 性別
 */
 @NotNull(message = "性別不能為空")
 private Integer sex;

 /**
 * 年齡
 */
 @NotNull(message = "年齡不能為空")
 @Min(value = 1, message = "年齡最小為1歲")
 @Max(value = 120, message = "年齡最大為120歲")
 private Integer age;

 /**
 * 郵箱
 */
 @NotBlank(message = "郵箱不能為空")
 @Email(message = "郵箱格式錯(cuò)誤")
 private String email;

}

2、創(chuàng)建controller

package com.yese.controller;

import com.yese.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
public class UserController {

 /**
 * controller方法的入?yún)⒗锩嬖趯?shí)體類前面加上@Validated
 */
 @PostMapping("/user")
 public void add(@RequestBody @Validated User user) {
 log.info("user====={}", user);
 }

}

3、創(chuàng)建全局異常處理器

package com.yese.config;


import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ConstraintViolationException;
import java.util.HashMap;
import java.util.Map;
import java.util.StringJoiner;

/**
 * 全局異常處理器
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
 /**
 * post方式提交json數(shù)據(jù),參數(shù)校驗(yàn)失敗后,會(huì)拋出一個(gè)MethodArgumentNotValidException
 */
 @ExceptionHandler(MethodArgumentNotValidException.class)
 public Map<String, Object> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
 // 獲取所有的錯(cuò)誤
 // List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();
 // 獲取錯(cuò)誤提示
 // System.out.println(fieldErrors.get(0).getDefaultMessage());
 // 獲取錯(cuò)誤字段
 // System.out.println(fieldErrors.get(0).getField());

 // 將所有的錯(cuò)誤提示使用";"拼接起來(lái)并返回
 StringJoiner sj = new StringJoiner(";");
 e.getBindingResult().getFieldErrors().forEach(x -> sj.add(x.getDefaultMessage()));

 // 此處通常定義一個(gè)全局相應(yīng)對(duì)象返回
 Map<String, Object> map = new HashMap<>();
 // 此處狀態(tài)碼可以通過(guò)枚舉或者常量定義
 map.put("code", 1001);
 map.put("msg", sj.toString());
 return map;
 }

 /**
 * get方式提交參數(shù),參數(shù)校驗(yàn)失敗后,會(huì)拋出一個(gè)ConstraintViolationException
 */
 @ExceptionHandler(ConstraintViolationException.class)
 public Map<String, Object> handleConstraintViolationException(ConstraintViolationException e) {
 StringJoiner sj = new StringJoiner(";");
 e.getConstraintViolations().forEach(x -> sj.add(x.getMessage()));

 Map<String, Object> map = new HashMap<>();
 map.put("code", 1001);
 map.put("msg", sj.toString());
 return map;
 }

}

4、測(cè)試

效果符合預(yù)期!

@Valid和@Validated

絕大多數(shù)場(chǎng)景下,我們使用 @Validated 注解即可。

而在有嵌套校驗(yàn)的場(chǎng)景,我們使用 @Valid 注解添加到成員屬性上。

附常用注解

javax.validation.constraints 包下

注解 驗(yàn)證的數(shù)據(jù)類型 說(shuō)明
@Null 任意類型 驗(yàn)證注解的元素值必須是null
@NotNull 任意類型 驗(yàn)證注解的元素值不是null
@NotBlank 字符串 驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長(zhǎng)度大于0)
@NotEmpty CharSequence子類型、Collection、Map、數(shù)組 驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0、集合大小不為0)
@Min(value=值) 數(shù)值類型 驗(yàn)證注解的元素值大于等于@Min指定的value值
@Max(value=值) 和@Min要求一樣 驗(yàn)證注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值) 和@Min要求一樣 驗(yàn)證注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值) 和@Min要求一樣 驗(yàn)證注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù)) 和@Min要求一樣 驗(yàn)證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限
@Size(min=下限, max=上限) 字符串、Collection、Map、數(shù)組等 驗(yàn)證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長(zhǎng)度、集合大小
@Positive 判斷正數(shù)
@PositiveOrZero 判斷正數(shù)或 0 。
@Negative 判斷負(fù)數(shù)。
@NegativeOrZero 判斷負(fù)數(shù)或 0 。
@Past 日期類型 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早
@Future 與@Past要求一樣 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間晚
@AssertFalse Boolean 驗(yàn)證注解的元素值是false
@AssertTrue Boolean 驗(yàn)證注解的元素值是true
@Range(min=最小值, max=最大值) BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型 驗(yàn)證注解的元素值在最小值和最大值之間
@Email 字符串 驗(yàn)證注解的元素值是Email,也可以通過(guò)regexp和flag指定自定義的email格式
@Pattern(regexp=正則表達(dá)式,flag=標(biāo)志的模式) 字符串 驗(yàn)證注解的元素值與指定的正則表達(dá)式匹配
@Valid 任何非原子類型 指定遞歸驗(yàn)證關(guān)聯(lián)的對(duì)象如用戶對(duì)象中有個(gè)地址對(duì)象屬性,如果想在驗(yàn)證用戶對(duì)象時(shí)一起驗(yàn)證地址對(duì)象的話,在地址對(duì)象上加@Valid注解即可級(jí)聯(lián)驗(yàn)證

org.hibernate.validator.constraints 包下,定義了一系列的約束( constraint )注解。如下:

@Range(min=, max=) :被注釋的元素必須在合適的范圍內(nèi)。

@Length(min=, max=) :被注釋的字符串的大小必須在指定的范圍內(nèi)。

@URL(protocol=,host=,port=,regexp=,flags=) :被注釋的字符串必須是一個(gè)有效的 URL 。

@SafeHtml :判斷提交的 HTML 是否安全。例如說(shuō),不能包含 javascript 腳本等等。

到此這篇關(guān)于詳解SpringBoot中的參數(shù)校驗(yàn)(項(xiàng)目實(shí)戰(zhàn))的文章就介紹到這了,更多相關(guān)SpringBoot 參數(shù)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java編程N(yùn)ashorn實(shí)例代碼

    Java編程N(yùn)ashorn實(shí)例代碼

    這篇文章主要介紹了Java編程N(yùn)ashorn實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java中的OkHttpClient 工具類

    Java中的OkHttpClient 工具類

    這篇文章主要介紹了Java中的OkHttpClient工具類,具有很好的參考價(jià)值,希望杜大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式

    Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式

    spring項(xiàng)目如何在啟動(dòng)項(xiàng)目是執(zhí)行一些操作,在spring中能通過(guò)那些操作實(shí)現(xiàn)這個(gè)功能呢,下面這篇文章主要給大家介紹了關(guān)于Springboot啟動(dòng)后立即某個(gè)執(zhí)行方法的四種方式,需要的朋友可以參考下
    2022-06-06
  • 詳解maven配置多倉(cāng)庫(kù)的方法示例

    詳解maven配置多倉(cāng)庫(kù)的方法示例

    這篇文章主要介紹了詳解maven配置多倉(cāng)庫(kù)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • springboot整合JPA過(guò)程解析

    springboot整合JPA過(guò)程解析

    這篇文章主要介紹了springboot整合JPA過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • IntelliJ IDEA 2018 最新激活碼(截止到2018年1月30日)

    IntelliJ IDEA 2018 最新激活碼(截止到2018年1月30日)

    這篇文章主要介紹了IntelliJ IDEA 2018 最新激活碼(截止到2018年1月30日)的相關(guān)資料,需要的朋友可以參考下
    2018-01-01
  • java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別

    java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別

    這篇文章主要介紹了java中Class.getMethods()和Class.getDeclaredMethods()方法的區(qū)別 ,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • SpringBoot的三大開(kāi)發(fā)工具小結(jié)

    SpringBoot的三大開(kāi)發(fā)工具小結(jié)

    本文主要介紹了SpringBoot的三大開(kāi)發(fā)工具,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • IDEA實(shí)現(xiàn)添加 前進(jìn)后退 到工具欄的操作

    IDEA實(shí)現(xiàn)添加 前進(jìn)后退 到工具欄的操作

    這篇文章主要介紹了IDEA 前進(jìn) 后退 添加到工具欄的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計(jì)

    Spring Cloud Alibaba 本地調(diào)試介紹及方案設(shè)計(jì)

    為了解決 本地調(diào)試 的問(wèn)題,本文實(shí)現(xiàn)了一種簡(jiǎn)單實(shí)用的策略,可以通過(guò) Nacos 動(dòng)態(tài)配置服務(wù)路由,還可以基于用戶,部門,組織等級(jí)別配置服務(wù)路由,實(shí)現(xiàn) 本地調(diào)試 的同時(shí),實(shí)際上也實(shí)現(xiàn) 灰度發(fā)布,感興趣的朋友跟隨小編一起看看吧
    2021-07-07

最新評(píng)論