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

java?spring?validation?自動、手動校驗

 更新時間:2024年09月13日 09:39:35   作者:木辰風  
HibernateValidator簡化了Java開發(fā)中的參數(shù)校驗過程,提供自動和手動兩種校驗方式,通過引入相關依賴并使用@Validated注解,可以實現(xiàn)自動校驗,手動校驗則需要使用ValidatorUtils類,此方法有效減少代碼重復,提高開發(fā)效率

參數(shù)校驗是一個常見的問題,比如字段非空,字段長度限制,郵箱格式、手機格式驗證等等。

避免校驗規(guī)則,寫一大串步驟,繁瑣重復。

Hibernate Validator為此提供了一套比較完善、便捷的驗證實現(xiàn)方式。

一、自動校驗

第一步,導入依賴

項目已經(jīng)引入spring-boot-starter-web包里面有hibernate-validator包,不需要引用hibernate validator依賴。

項目還未引入spring-boot-starter-web包可以引入以下依賴:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.1.Final</version>
</dependency>

第二步,統(tǒng)一異常處理

ValidateExceptionController

import com.central.common.model.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
/**
 * 統(tǒng)一異常處理
 */
@Slf4j
@RestControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class ValidateExceptionController {
    //如果能精確匹配到該異常就會執(zhí)行這個方法,后續(xù)執(zhí)行下面的方法
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public Result handelValidateException(MethodArgumentNotValidException e) {
        log.error("數(shù)據(jù)校驗出現(xiàn)問題:{},異常類型:{}", e.getMessage(), e.getClass());
        Map<String, String> map = new HashMap<>();
        //1.獲取校驗錯誤結果
        BindingResult result = e.getBindingResult();
        result.getFieldErrors().forEach(fieldError -> {
            //獲取每個錯誤的屬性名字
            String field = fieldError.getField();
            //獲取每個錯誤提示信息
            String defaultMessage = fieldError.getDefaultMessage();
            map.put(field, defaultMessage);
        });
        return Result.failed(map, "數(shù)據(jù)校驗錯誤");
    }
}

第三步,定義接口接收實體DTO

定義校驗規(guī)則,可以參考

關于Java Validation (驗證注解) 見文末補充介紹。

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
@Data
@ApiModel("售后申請接口-接收實體DTO")
public class AfterServiceApplyDTO implements Serializable {
    @NotBlank(message = "訂單編號不為空")
    @ApiModelProperty(value = "訂單編號", required = true)
    private String grandsonOrderCode;
    @NotNull(message = "申請售后類型不為空")
    @ApiModelProperty(value = "申請售后類型: 10:退貨 20:換貨 30:維修", required = true)
    private Integer customerExpect;
    @NotBlank(message = "產(chǎn)品問題描述不為空")
    @ApiModelProperty(value = "產(chǎn)品問題描述", required = true)
    private String questionDesc;
    @ApiModelProperty("問題描述圖片鏈接地址,多個圖片以“,”分隔")
    private String questionPic;
    @Valid
    @NotNull(message = "客戶信息實體不為空")
    @ApiModelProperty("客戶信息實體")
    private AfterSaleCustomerDTO asCustomerDto;
    @Valid
    @Size(min = 1, max = 1, message = "只能申請1個商品")
    @NotNull(message = "申請單明細列表不為空")
    @ApiModelProperty("申請單明細列表")
    private List<AfterSaleDetailDTO> asDetailDtos;
}

第四步,在Contoller接口中增加參數(shù)注解@Validated

表示只校驗當前參數(shù)

@Api(tags = "【售后】訂單售后API接口")
@RestController
public class AfterServiceApiController {
    /**
     * 售后申請接口
     * @param afterServiceApplyDTO 售后申請參數(shù)
     * @return 操作結果
     */
    @ApiOperation("售后申請接口")
    @PostMapping("/afterService/api/apply")
    public Result apply(@Validated @RequestBody AfterServiceApplyDTO afterServiceApplyDTO) {
        // todo
        return null;
    }
}

第五步,測試結果

Postman發(fā)送錯誤數(shù)據(jù)觸發(fā)驗證測試

二、手動校驗

第一步,校驗工具類

ValidatorUtils

import com.central.business.afterService.dto.AfterServiceApplyDTO;
import com.central.common.model.Result;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
 * 校驗工具類
 */
public class ValidatorUtils {
    private static final Validator validator;
    // 第一種方式創(chuàng)建Validator
    static {
        // 普通模式(默認是這個模式)
        // 普通模式(會校驗完所有的屬性,然后返回所有的驗證失敗信息)
        validator = Validation.buildDefaultValidatorFactory().getValidator();
    }
    //第二種方式創(chuàng)建Validator
//    static {
//        // 1.普通模式(默認是這個模式)
//        // 普通模式(會校驗完所有的屬性,然后返回所有的驗證失敗信息)
//        // .failFast(false)
//        // 或 .addProperty("hibernate.validator.fail_fast", "false")
//
//        // 2.快速失敗返回模式
//        // 快速失敗返回模式(只要有一個驗證失敗,則返回)
//        // .addProperty("hibernate.validator.fail_fast", "true")
//        // 或 .failFast(true)
//        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
//                .configure()
//                .failFast(true)
                .addProperty("hibernate.validator.fail_fast", "true")
//                .buildValidatorFactory();
//        validator = validatorFactory.getValidator();
//    }
    /**
     * 校驗對象,返回校驗失敗List信息
     *
     * @param object 對象
     * @param groups 組
     * @return 校驗失敗List信息
     */
    public static List<String> validateEntity(Object object, Class<?>... groups) {
        List<String> list = new ArrayList<>();
        Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
        for (ConstraintViolation<Object> violation : validate) {
            list.add(violation.getMessage());
        }
        return list;
    }
    /**
     * 校驗對象,返回校驗失敗Map信息
     *
     * @param object 對象
     * @param groups 組
     * @return 校驗失敗Map信息,key為屬性(字段名),value為校驗失敗信息
     */
    public static Map<String, String> validateEntityProperty(Object object, Class<?>... groups) {
        Map<String, String> map = new HashMap<>();
        Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
        for (ConstraintViolation<Object> violation : validate) {
            map.put(violation.getPropertyPath().toString(), violation.getMessage());
        }
        return map;
    }
    /**
     * 校驗對象,返回校驗失敗Result信息
     *
     * @param object 對象
     * @param groups 組
     * @return 校驗失敗Result,校驗失敗返回錯誤信息,成功返回成功信息
     */
    public static Result<Map<String, String>> validateEntityResult(Object object, Class<?>... groups) {
        Map<String, String> map = new HashMap<>();
        Set<ConstraintViolation<Object>> validate = validator.validate(object, groups);
        for (ConstraintViolation<Object> violation : validate) {
            map.put(violation.getPropertyPath().toString(), violation.getMessage());
        }
        if (map.size() > 0) {
            return Result.failed(map, "數(shù)據(jù)校驗錯誤!");
        }
        return Result.succeed("數(shù)據(jù)校驗成功!");
    }
    public static void main(String[] args) {
        AfterServiceApplyDTO afterServiceApplyDTO = new AfterServiceApplyDTO();
        System.out.println(validateEntityResult(afterServiceApplyDTO));
    }
}

第二步,測試結果

Result(datas={questionDesc=產(chǎn)品問題描述不為空, grandsonOrderCode=供應鏈三級訂單編號不為空, reason=售后原因不為空, asCustomerDto=客戶信息實體不為空, asDetailDtos=申請單明細列表不為空, businessPlatformCode=業(yè)務商城售后申請單號不為空, customerExpect=申請售后類型不為空}, resp_code=1, resp_msg=數(shù)據(jù)校驗錯誤!)

補充:Java Validation (驗證注解)

驗證注解驗證的數(shù)據(jù)類型說明
@AssertFalseBoolean,boolean驗證注解的元素值是false
@AssertTrueBoolean,boolean驗證注解的元素值是true
@NotNull任意類型驗證注解的元素值不是null
@Null任意類型驗證注解的元素值是null
@Min(value=值)BigDecimal,BigInteger, byte,short, int, long,等任何Number或CharSequence(存儲的是數(shù)字)子類型驗證注解的元素值大于等于@Min指定的value值
@Max(value=值)和@Min要求一樣驗證注解的元素值小于等于@Max指定的value值
@DecimalMin(value=值)和@Min要求一樣驗證注解的元素值大于等于@ DecimalMin指定的value值
@DecimalMax(value=值)和@Min要求一樣驗證注解的元素值小于等于@ DecimalMax指定的value值
@Digits(integer=整數(shù)位數(shù), fraction=小數(shù)位數(shù))和@Min要求一樣驗證注解的元素值的整數(shù)位數(shù)和小數(shù)位數(shù)上限
@Size(min=下限, max=上限)字符串、Collection、Map、數(shù)組等驗證注解的元素值的在min和max(包含)指定區(qū)間之內(nèi),如字符長度、集合大小
@Pastjava.util.Date,java.util.Calendar;Joda Time類庫的日期類型驗證注解的元素值(日期類型)比當前時間早
@Future與@Past要求一樣驗證注解的元素值(日期類型)比當前時間晚
@NotBlankCharSequence子類型驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同于@NotEmpty,@NotBlank只應用于字符串且在比較時會去除字符串的首位空格
@Length(min=下限, max=上限)CharSequence子類型驗證注解的元素值長度在min和max區(qū)間內(nèi)
@NotEmptyCharSequence子類型、Collection、Map、數(shù)組驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)
@Range(min=最小值, max=最大值)BigDecimal,BigInteger,CharSequence, byte, short, int, long等原子類型和包裝類型驗證注解的元素值在最小值和最大值之間
@Email(regexp=正則表達式,flag=標志的模式)CharSequence子類型(如String)驗證注解的元素值是Email,也可以通過regexp和flag指定自定義的email格式
@Pattern(regexp=正則表達式,flag=標志的模式)String,任何CharSequence的子類型驗證注解的元素值與指定的正則表達式匹配
@Valid任何非原子類型指定遞歸驗證關聯(lián)的對象如用戶對象中有個地址對象屬性,如果想在驗證用戶對象時一起驗證地址對象的話,在地址對象上加@Valid注解即可級聯(lián)驗證

到此這篇關于java spring validation 自動、手動校驗的文章就介紹到這了,更多相關java spring validation校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java面向?qū)ο笤O計原則之接口隔離原則示例詳解

    java面向?qū)ο笤O計原則之接口隔離原則示例詳解

    這篇文章主要為大家介紹了java面向?qū)ο笤O計原則之接口隔離原則的示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-10-10
  • java注解實現(xiàn)websocket服務的兩種方式

    java注解實現(xiàn)websocket服務的兩種方式

    Java WebSocket是一種基于TCP協(xié)議的雙向全雙工消息傳輸技術,它允許服務器和客戶端之間實時通信,具有低延遲和高效率的特點,下面這篇文章主要給大家介紹了關于java注解實現(xiàn)websocket服務的兩種方式,需要的朋友可以參考下
    2024-08-08
  • Spring @ComponentScan注解使用案例詳細講解

    Spring @ComponentScan注解使用案例詳細講解

    @ComponentScan注解的作用可以簡述為:將項目中所有被@Component注解直接或者間接標記的類---->組裝成BeanDefinition---->然后以key=beanName, value=BeanDefinition的形式存儲,為后續(xù)生成bean對象做準備
    2023-03-03
  • java模擬http的Get/Post請求,并設置ip與port代理的方法

    java模擬http的Get/Post請求,并設置ip與port代理的方法

    下面小編就為大家?guī)硪黄猨ava模擬http的Get/Post請求,并設置ip與port代理的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • EasyCode插件使用詳解(推薦)

    EasyCode插件使用詳解(推薦)

    EasyCode是idea的一個插件,這個插件功能很強大,今天通過本文給大家分享EasyCode插件使用詳解,需要的朋友可以參考下
    2020-09-09
  • 詳解Java程序讀取properties配置文件的方法

    詳解Java程序讀取properties配置文件的方法

    這篇文章主要介紹了Java讀取properties配置文件的方法講解,properties可以被看作是Java世界的ini,Java中有Properties可以操作它,需要的朋友可以參考下
    2016-04-04
  • 通過Java添加Word文本框過程詳解

    通過Java添加Word文本框過程詳解

    這篇文章主要介紹了通過Java添加Word文本框過程詳解,在Word中,文本框是指一種可移動、可調(diào)節(jié)大小的文字或圖形容器。我們可以向文本框中添加文字、圖片、表格等對象,下面,將通過Java編程來實現(xiàn)添加以上對象到Word文本框,需要的朋友可以參考下
    2019-07-07
  • Java利用Swagger2自動生成對外接口的文檔

    Java利用Swagger2自動生成對外接口的文檔

    這篇文章主要介紹了Java利用Swagger2自動生成對外接口的文檔,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java Web Listener實現(xiàn)事件監(jiān)聽與處理

    Java Web Listener實現(xiàn)事件監(jiān)聽與處理

    Java Web開發(fā)中的Listener是一種事件機制,通過監(jiān)聽Web應用程序的事件,實現(xiàn)對事件的處理,從而實現(xiàn)更加靈活和高效的應用程序開發(fā)。Listener能夠監(jiān)聽的事件包括應用程序啟動和關閉、Session創(chuàng)建和銷毀、請求和響應對象的創(chuàng)建和銷毀等
    2023-04-04
  • Spring mvc AJAX技術實現(xiàn)原理解析

    Spring mvc AJAX技術實現(xiàn)原理解析

    這篇文章主要介紹了Spring mvc AJAX技術實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03

最新評論

温州市| 咸丰县| 华蓥市| 黄冈市| 黎城县| 安远县| 北海市| 华安县| 和林格尔县| 南部县| 松阳县| 永善县| 黄骅市| 习水县| 银川市| 镇远县| 成都市| 斗六市| 横山县| 汉源县| 驻马店市| 江都市| 双牌县| 红河县| 枞阳县| 公主岭市| 安康市| 涟水县| 唐海县| 平度市| 米泉市| 龙南县| 宜都市| 连州市| 东乌| 凤山市| 英吉沙县| 务川| 拜泉县| 溆浦县| 淳安县|