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

Java參數(shù)校驗(yàn)中validation和validator的區(qū)別詳解

 更新時(shí)間:2023年10月09日 09:38:08   作者:靖節(jié)先生  
這篇文章主要介紹了Java參數(shù)校驗(yàn)中validation和validator的區(qū)別詳解,一般對(duì)于復(fù)雜的業(yè)務(wù)參數(shù)校驗(yàn),可以通過(guò)校驗(yàn)類單獨(dú)的校驗(yàn)方法進(jìn)行處理,通常對(duì)于一些與業(yè)務(wù)無(wú)關(guān)簡(jiǎn)單的參數(shù)校驗(yàn)可以采用validation和 validator通過(guò)注解的方式實(shí)現(xiàn)校驗(yàn),需要的朋友可以參考下

1. 參數(shù)校驗(yàn)概述

常見(jiàn)的業(yè)務(wù)開(kāi)發(fā)中無(wú)可避免的會(huì)進(jìn)行請(qǐng)求參數(shù)校驗(yàn),一般對(duì)于復(fù)雜的業(yè)務(wù)參數(shù)校驗(yàn),可以通過(guò)校驗(yàn)類單獨(dú)的校驗(yàn)方法進(jìn)行處理,通常對(duì)于一些與業(yè)務(wù)無(wú)關(guān)簡(jiǎn)單的參數(shù)校驗(yàn)可以采用javax.validation 和 hibernate-validator通過(guò)注解的方式實(shí)現(xiàn)校驗(yàn)。

2. validation與validator區(qū)別

javax的validation是Java定義的一套基于注解的數(shù)據(jù)校驗(yàn)規(guī)范,目前已經(jīng)從JSR 303的1.0版本升級(jí)到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),已經(jīng)經(jīng)歷了三個(gè)版本。 需要注意的是,JSR只是一項(xiàng)標(biāo)準(zhǔn),它規(guī)定了一些校驗(yàn)注解的規(guī)范,但沒(méi)有實(shí)現(xiàn),比如@Null、@NotNull、@Pattern等,它們位于 javax.validation.constraints這個(gè)包下。而hibernate validator是對(duì)這個(gè)規(guī)范的實(shí)現(xiàn),并增加了一些其他校驗(yàn)注解,如 @NotBlank、@NotEmpty、@Length等,它們位于org.hibernate.validator.constraints這個(gè)包下。

如果我們的項(xiàng)目使用了Spring Boot,hibernate validator框架已經(jīng)集成在 spring-boot-starter-web中,所以無(wú)需再添加其他依賴。如果不是Spring Boot項(xiàng)目,需要添加如下依賴。

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

3. validation注解說(shuō)明

注解說(shuō)明
@Null被注釋的元素必須為null
@NotNull被注釋的元素不能為null
@AssertTrue被注釋的元素必須為true
@AssertFalse被注釋的元素必須為false
@Min(value)被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
@Max(value)被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
@DecimalMin(value)被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value)被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
@Size(max,min)被注釋的元素的大小必須在指定的范圍內(nèi)
@Digits(integer, fraction)被注釋的元素必須是一個(gè)數(shù)字,其值必須必須在可接受的范圍內(nèi)
@Past被注釋的元素必須是一個(gè)過(guò)去的日期
@Future被注釋的元素必須是一個(gè)將來(lái)的日期
@Pattern(value)被注釋的元素必須符合指定的正則表達(dá)式

4. validator注解說(shuō)明

注解說(shuō)明
@NotBlank被注釋的元素不能為null,去除空格( trim() 之后 size > 0) 且長(zhǎng)度必須大于0,只能用于注解字符串
@NotEmpty被注釋的元素值不為null且不為空,支持字符串、集合、Map和數(shù)組類型
@Length(min=,max=)檢查所屬的字段的長(zhǎng)度是否在min和max之間,只能用于字符串
@Email被注釋的元素必須是電子郵箱地址
@Range(min=,max=,message=)被注釋的元素必須在合適的范圍內(nèi)
@Pattern(regex=,flag=)被注釋的元素必須符合指定的正則表達(dá)式

注意:

1.正則表達(dá)式@Pattern注解只用于String類型的字段上。數(shù)字類型的可用@Range注解。

2.需要在Controller中請(qǐng)求對(duì)象或者參數(shù)前加@Validated或@Valid注解一起使用, @Validated和@Valid注解區(qū)別不是很大,一般情況下任選一個(gè)即可,區(qū)別如下:

注解 @Validated @Valid 所屬的包屬于org.springframework.validation.annotation包下的,是spring提供的屬于javax.validation包下,是jdk給提供的是否支持分組和排序是否

雖然@Validated比@Valid更加強(qiáng)大,在@Valid之上提供了分組功能和驗(yàn)證排序功能,不過(guò)在實(shí)際項(xiàng)目中一直沒(méi)有用到過(guò) Hibernate-validate框架中的注解是需要加在實(shí)體中一起使用的

5. 日期格式化說(shuō)明

java日期問(wèn)題,針對(duì)Date類型字段。

1.接收前端校驗(yàn)注解,@DateTimeFormat 接受前臺(tái)的時(shí)間格式 傳到后臺(tái)的格式。

@DateTimeFormat(pattern="yyyy-MM-dd")
private Date born;

2.后端返回給前端日期格式化,使用場(chǎng)景數(shù)據(jù)庫(kù)存儲(chǔ)的是yyyy-MM-dd HH:mm:ss,但是前端需要yyyy-MM-dd的時(shí)候可以使用此注解。

@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
private Date born;

6. 實(shí)現(xiàn)驗(yàn)證

6.1 引入依賴

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>category</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>category</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        <!--數(shù)據(jù)庫(kù)連接誒-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--常用工具-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1.1-jre</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
        </dependency>
        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <!--字段校驗(yàn)-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>2.0.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.13.Final</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

6.2 代碼實(shí)現(xiàn)

1.實(shí)體類

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.*;
/**
 * 員工實(shí)體類
 *
 * @author zrj
 * @since 2021/7/31
 **/
@Data
@ApiModel(value = "Employee", description = "員工信息")
public class Employee {
    @NotNull(message = "userId is empty")
    @ApiModelProperty(value = "員工ID")
    private Integer id;
    @NotBlank(message = "員工姓名不能為空")
    @Length(min = 1, max = 100, message = "員工姓名長(zhǎng)度不能超過(guò)50字")
    @ApiModelProperty(value = "員工姓名")
    private String name;
    @Range(min = 1, max = 200, message = "年齡范圍[1,200]")
    @ApiModelProperty(value = "年齡")
    private Integer age;
    @Pattern(regexp = "^[0-1]$", message = "員工類型范圍[0,1]")
    @ApiModelProperty(value = "員工類型(0行政崗;1基礎(chǔ)崗")
    private String type;
    @Pattern(regexp = "^[1][^0^1^2][0-9]{9}$", message = "員工手機(jī)號(hào)碼不合法")
    @ApiModelProperty(value = "員工手機(jī)號(hào)碼")
    private String phone;
    @Email(message = "員工郵箱不合法")
    @Length(min = 1, max = 50, message = "員工郵箱長(zhǎng)度")
    @ApiModelProperty(value = "員工郵箱")
    private String email;
    @Length(min = 0, max = 200, message = "備注長(zhǎng)度不能超過(guò)100字")
    @ApiModelProperty(value = "備注")
    private String remarks;
}

2.控制類

import com.example.category.entity.Employee;
import com.example.category.entity.Response;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
/**
 * 員工控制類
 *
 * @author zrj
 * @since 2021/7/31
 **/
@RestController
@RequestMapping("/employee")
@Api(value = "employee", description = "員工管理")
public class EmployeeController {
    @GetMapping("/test")
    @ApiOperation(value = "test測(cè)試", notes = "test測(cè)試", httpMethod = "GET")
    public Response test() {
        return Response.success("查詢成功", null);
    }
    /**
     * Valid測(cè)試
     * 這里職位測(cè)試@Valid,所以不在寫(xiě)其他各層
     */
    @PostMapping("/validEpmloyee")
    @ApiOperation(value = "Valid測(cè)試", notes = "Valid測(cè)試", httpMethod = "POST")
    public Response<Employee> validEpmloyee(@Valid @RequestBody Employee employee) {
        System.out.println("測(cè)試請(qǐng)求對(duì)象:" + employee);
        if (employee != null) {
            return Response.success("查詢成功", employee);
        }
        return Response.fail("查詢失敗");
    }
}

3.結(jié)果集響應(yīng)碼

package com.example.category.entity;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * 結(jié)果集封裝
 *
 * @author zrj
 * @date 2021/6/2
 * @since V1.0
 **/
@Data
@Component
public class Response<T> {
    private static ResponseCode responseCode;
    /**
     * 提示消息
     */
    private String message;
    /**
     * 具體返回的數(shù)據(jù)
     */
    private T data;
    /**
     * 狀態(tài)碼
     */
    private String code;
    private Response(String code, String message, T data) {
        this.message = message;
        this.code = code;
        this.data = data;
    }
    private Response(String code, String msg) {
        this.message = msg;
        this.code = code;
    }
    @Autowired
    public Response(ResponseCode responseCode) {
        Response.responseCode = responseCode;
    }
    /**
     * 返回成功Response對(duì)象
     */
    public static <T> Response<T> success(String successMessage, T data) {
        return new Response<>(responseCode.getSuccessCode(), successMessage, data);
    }
    /**
     * 返回錯(cuò)誤Response對(duì)象
     */
    public static <T> Response<T> fail(String errorMessage) {
        return new Response<>(responseCode.getErrorCode(), errorMessage);
    }
}
import lombok.Data;
import org.springframework.stereotype.Component;
/**
 * 響應(yīng)碼
 *
 * @author zrj
 * @date 2021/6/2
 * @since V1.0
 **/
@Data
@Component
public class ResponseCode {
    public String successCode = "200";
    public String errorCode = "500";
    public String authErrorCode = "300";
}

4.異常切面封裝類

import com.example.category.entity.Response;
import com.fasterxml.jackson.databind.JsonMappingException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
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.method.HandlerMethod;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.List;
import java.util.Set;
/**
 * 異常切面封裝類
 *
 * @author zrj
 * @since 2021/7/31
 **/
@ControllerAdvice
@ResponseBody
@Slf4j
public class ExceptionHandlerAdvice {
    /**
     * Exception
     */
    @ExceptionHandler(Exception.class)
    public Response<String> handleGlobalException(Exception exception, HandlerMethod handlerMethod) {
        if (exception instanceof MethodArgumentNotValidException) {
            List<ObjectError> errors = ((MethodArgumentNotValidException) exception).getBindingResult().getAllErrors();
            StringBuilder sb = new StringBuilder();
            if (!CollectionUtils.isEmpty(errors)) {
                for (ObjectError error : errors) {
                    if (sb.length() != 0) {
                        sb.append(",");
                    }
                    sb.append(error.getDefaultMessage());
                }
            }
            return Response.fail(sb.toString());
        }
        // 約束異常
        if (exception instanceof ConstraintViolationException) {
            Set<ConstraintViolation<?>> exceptionSet = ((ConstraintViolationException) exception).getConstraintViolations();
            StringBuilder sb = new StringBuilder();
            if (!CollectionUtils.isEmpty(exceptionSet)) {
                for (ConstraintViolation<?> set : exceptionSet) {
                    if (sb.length() != 0) {
                        sb.append(",");
                    }
                    sb.append(set.getMessageTemplate());
                }
            }
            return Response.fail(sb.toString());
        }
        // 參數(shù)類型轉(zhuǎn)換異常處理
        if (exception instanceof MethodArgumentTypeMismatchException) {
            return Response.fail(((MethodArgumentTypeMismatchException) exception).getName() + " 類型不匹配");
        }
        if (exception instanceof JsonMappingException) {
            return Response.fail("JSON格式錯(cuò)誤, " + exception.getLocalizedMessage());
        }
        if (exception instanceof HttpMessageNotReadableException) {
            return Response.fail("請(qǐng)求體格式錯(cuò)誤, " + exception.getLocalizedMessage());
        }
        if (exception instanceof MissingServletRequestParameterException) {
            String paramName = ((MissingServletRequestParameterException) exception).getParameterName();
            return Response.fail(paramName + " 不能為空");
        }
        //if (exception instanceof MarketingException) {
        //    MarketingException marketingException = (MarketingException) exception;
        //    return RdfaResult.fail(marketingException.getErrorCodeEnum().getCode(), exception.getMessage());
        //}
        // 其他異常打印日志
        log.error("{}.{} error, ", handlerMethod.getBeanType().getSimpleName(), handlerMethod.getMethod().getName(), exception);
        //if (exception instanceof RpcException) {
        //    return RdfaResult.fail(ErrorCodeEnum.RPC_ERROR.getCode(), "RPC調(diào)用錯(cuò)誤,請(qǐng)稍后重試");
        //}
        return Response.fail("服務(wù)器內(nèi)部錯(cuò)誤,請(qǐng)聯(lián)系開(kāi)發(fā)人員!");
    }
}

6.3 實(shí)現(xiàn)驗(yàn)證

在這里插入圖片描述

在這里插入圖片描述

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

相關(guān)文章

  • Java中Retry方法的簡(jiǎn)單實(shí)現(xiàn)

    Java中Retry方法的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了Java中Retry方法的簡(jiǎn)單實(shí)現(xiàn),Retry主要是利用Java的lambda表達(dá)式和線程接口實(shí)現(xiàn)有返回值和無(wú)返回值的重試,思考了下就寫(xiě)了一個(gè)簡(jiǎn)易R(shí)etry功能分享出來(lái),需要的朋友可以參考下
    2024-01-01
  • Spring Boot接口限流的常用算法及特點(diǎn)

    Spring Boot接口限流的常用算法及特點(diǎn)

    這篇文章主要給大家介紹了關(guān)于Spring Boot接口限流的常用算法及特點(diǎn)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • RabbitMQ之死信隊(duì)列深入解析

    RabbitMQ之死信隊(duì)列深入解析

    這篇文章主要介紹了RabbitMQ之死信隊(duì)列深入解析,?死信,顧名思義就是無(wú)法被消費(fèi)的消息,字面意思可以這樣理解,一般來(lái)說(shuō),producer將消息投遞到 broker 或者直接到 queue 里了,consumer 從 queue 取消息進(jìn)行消費(fèi),需要的朋友可以參考下
    2023-09-09
  • SpringBoot自定義消息轉(zhuǎn)換器的實(shí)現(xiàn)與應(yīng)用

    SpringBoot自定義消息轉(zhuǎn)換器的實(shí)現(xiàn)與應(yīng)用

    Spring Boot 默認(rèn)提供了多種消息轉(zhuǎn)換器,如 Jackson 用于 JSON 格式轉(zhuǎn)換、JAXB 用于 XML 格式轉(zhuǎn)換等,然而,實(shí)際開(kāi)發(fā)中往往需要根據(jù)業(yè)務(wù)需求進(jìn)行自定義的消息轉(zhuǎn)換器,文將詳細(xì)介紹如何在 Spring Boot 中實(shí)現(xiàn)自定義消息轉(zhuǎn)換器,探討其工作原理、配置方式以及實(shí)際應(yīng)用場(chǎng)景
    2025-01-01
  • java 裝飾模式(Decorator Pattern)詳解及實(shí)例代碼

    java 裝飾模式(Decorator Pattern)詳解及實(shí)例代碼

    裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝
    2016-10-10
  • Spring整合CXF webservice restful實(shí)例詳解

    Spring整合CXF webservice restful實(shí)例詳解

    這篇文章主要為大家詳細(xì)介紹了Spring整合CXF webservice restful的實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法

    springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法

    這篇文章主要介紹了springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法 ,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • spring使用RedisTemplate的操作類訪問(wèn)Redis

    spring使用RedisTemplate的操作類訪問(wèn)Redis

    本篇文章主要介紹了spring使用RedisTemplate的操作類訪問(wèn)Redis,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng)

    javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng)

    這篇文章主要為大家詳細(xì)介紹了javaweb如何實(shí)現(xiàn)請(qǐng)求和響應(yīng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • java高級(jí)排序之希爾排序

    java高級(jí)排序之希爾排序

    這篇文章主要介紹了java高級(jí)排序之希爾排序 ,需要的朋友可以參考下
    2015-04-04

最新評(píng)論

秦安县| 旺苍县| 霍山县| 武清区| 买车| 错那县| 吉安县| 三都| 内乡县| 高陵县| 康平县| 蒙山县| 五指山市| 家居| 镇安县| 六盘水市| 陇南市| 临泽县| 横山县| 资中县| 松潘县| 雷波县| 连江县| 图们市| 台东县| 东乡族自治县| 全椒县| 黔南| 盐源县| 方正县| 桃园县| 兰溪市| 湾仔区| 天台县| 马公市| 平昌县| 平泉县| 沂水县| 隆昌县| 达州市| 永靖县|