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

SpringBoot學(xué)習(xí)篇之@Valid與@Validated的區(qū)別

 更新時(shí)間:2022年11月01日 11:54:14   作者:陳老老老板  
@Valid是使用Hibernate?validation的時(shí)候使用,@Validated是只用Spring?Validator校驗(yàn)機(jī)制使用,下面這篇文章主要給大家介紹了關(guān)于SpringBoot學(xué)習(xí)篇之@Valid與@Validated區(qū)別的相關(guān)資料,需要的朋友可以參考下

1.介紹

說明: 其實(shí)@Valid 與 @Validated都是做數(shù)據(jù)校驗(yàn)的,只不過注解位置與用法有點(diǎn)不同。

不同點(diǎn):

(1)

@Valid是使用Hibernate validation的時(shí)候使用。@Validated是只用Spring Validator校驗(yàn)機(jī)制使用。

(2)

@Valid 可以嵌套驗(yàn)證

@Validation 不能進(jìn)行嵌套驗(yàn)證

(3)

@Valid:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性(field)上。

@Validated:用在類、方法和方法參數(shù)上。但不能用于成員屬性(field)。

(如果@Validated注解在成員屬性上,則會(huì)報(bào)不適用于field的錯(cuò)誤。)

(4)

@Valid:沒有分組功能。

@Validated:提供分組功能,可以在參數(shù)驗(yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。

2.用法

(1)@Valid用法

a.導(dǎo)入依賴

SpringBoot項(xiàng)目:

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>1.1.0.Final</version>
</dependency>
 
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
</dependency>

b.使用前提是實(shí)體類中屬性使用注解進(jìn)行校驗(yàn)

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

//lombok
@Data
public class User implements Serializable {

    //用戶名
    @NotBlank(message = "請輸入名稱")
    @Length(message = "名稱不能超過個(gè) {max} 字符", max = 10)
    private String username;

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

c.在Controller方法參數(shù)中加上@Valid注解

package com.example.demo.controller;

import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class UserController {

    public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());

    @PostMapping("/add")
    @ResponseBody
    public String add(@Validated User user, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
            });
            return "添加失敗";
        }
        return "添加成功";
    }
}

經(jīng)過測試填寫錯(cuò)誤數(shù)據(jù),會(huì)在控制臺(tái)輸出報(bào)錯(cuò)信息。

(2)@Validated用法

a.開啟校驗(yàn)框架(與上面一樣)

<!--1.導(dǎo)入JSR303規(guī)范-->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
<!--使用hibernate框架提供的校驗(yàn)器做實(shí)現(xiàn)-->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

c.在需要開啟校驗(yàn)功能的類上使用注解@Validated開啟校驗(yàn)功能,對具體的字段設(shè)置校驗(yàn)規(guī)則,這里講的是可以在類上使用@Validated注解,配合xml數(shù)據(jù)綁定。

@Component
@Data
@ConfigurationProperties(prefix = "servers")
//開啟對當(dāng)前bean的屬性注入校驗(yàn)
@Validated
public class ServerConfig {
    //設(shè)置具體的規(guī)則
    @Max(value = 8888,message = "最大值不能超過8888")
    @Min(value = 202,message = "最小值不能低于202")
    private int port;
}

(3)@Validated實(shí)現(xiàn)分組校驗(yàn)

注意 分組校驗(yàn)就是把條件加入組中,可以自由選擇開啟那些組的校驗(yàn)方式。

a.分組接口

package com.example.demo.pojo;
public interface Group {
    interface Update{};
    interface FindAll{};
}

b.實(shí)體類

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

//lombok
@Data
public class User implements Serializable {

    //用戶名
    @NotBlank(message = "請輸入用戶名不能為空",groups = {Group.FindAll.class})
    @Length(message = "名稱不能超過個(gè) {max} 字符", max = 10 ,groups = {Group.FindAll.class})
    private String username;

    //年齡
    @NotBlank(message = "請輸入年齡不能為空",groups = {Group.Update.class})
    @Range(message = "年齡范圍為 {min} 到 {max} 之間", min = 1, max = 100,groups = {Group.Update.class})
    private String age;
}

c.controller接口:

注意 @Validated有參數(shù) value中寫分組名稱

package com.example.demo.controller;

import com.example.demo.pojo.Group;
import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class UserController {

    public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());

    @PostMapping("/add")
    @ResponseBody
    //注意@Validated有參數(shù) value中寫分組名稱
    public String add(@Validated(value = {Group.Update.class}) User user, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
            });
            return "添加失敗";
        }
        return "添加成功";
    }
}

(4)@Valid 實(shí)現(xiàn)嵌套校驗(yàn)

注: 嵌套檢測就是在一個(gè)User類中,存在另外一個(gè)User2類的屬性。嵌套檢測User同時(shí)也檢測User2。

a.實(shí)體類User

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

//lombok
@Data
public class User implements Serializable {

    //用戶名
    @NotBlank(message = "請輸入用戶名不能為空1")
    private String username;

    //年齡
    @NotBlank(message = "請輸入年齡不能為空1")
    private String age;

    @Valid
    @NotNull(message = "user2不能為空1")
    private User2 user2;
}
}

b.實(shí)體類User2

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.Range;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

package com.example.demo.pojo;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.NotNull;
import java.io.Serializable;

//lombok
@Data
public class User2 implements Serializable {

    //用戶名
    @Length(message = "名稱不能超過個(gè) {max} 字符2", max = 10 )
    private String username2;

    //年齡

    @Range(message = "年齡范圍為 {min} 到 {max} 之間2", min = 1, max = 100)
    private String age2;
}

c.Controller類(這里使用@Valid)

package com.example.demo.controller;

import com.example.demo.pojo.Group;
import com.example.demo.pojo.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class UserController {

    public static final Logger logger = LoggerFactory.getLogger(UserController.class.getName());

    @PostMapping("/add")
    @ResponseBody
    public String add(@Valid User user, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            List<ObjectError> allErrors = bindingResult.getAllErrors();
            allErrors.forEach( v ->{
                logger.error(v.getObjectName()+"======"+v.getDefaultMessage());
            });
            return "添加失敗";
        }
        return "添加成功";
    }
}

總結(jié):

了解這兩個(gè)注解可以讓你的校驗(yàn)數(shù)據(jù)更加方便。

到此這篇關(guān)于SpringBoot學(xué)習(xí)篇之@Valid與@Validated區(qū)別的文章就介紹到這了,更多相關(guān)SpringBoot @Valid與@Validated區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Spring插件實(shí)現(xiàn)策略模式的案例詳解

    利用Spring插件實(shí)現(xiàn)策略模式的案例詳解

    Spring插件提供了一種更實(shí)用的插件開發(fā)方法,它提供了插件實(shí)現(xiàn)擴(kuò)展核心系統(tǒng)功能的核心靈活性,但當(dāng)然不提供核心OSGi功能,如動(dòng)態(tài)類加載或運(yùn)行時(shí)安裝和部署插件,本文就來聊下如何使用spring插件來實(shí)現(xiàn)策略模式,需要的朋友可以參考下
    2023-05-05
  • 詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo)

    詳解SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo)

    這篇文章主要介紹了SpringBoot中的index首頁的訪問、自定義Favicon圖標(biāo),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • ShardingSphere數(shù)據(jù)庫讀寫分離算法及測試示例詳解

    ShardingSphere數(shù)據(jù)庫讀寫分離算法及測試示例詳解

    這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)庫讀寫分離算法及測試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 詳解Java編程的Observer觀察者設(shè)計(jì)模式

    詳解Java編程的Observer觀察者設(shè)計(jì)模式

    這篇文章主要介紹了Java編程的Observer觀察者設(shè)計(jì)模式,觀察者模式定義了一個(gè)一對多的依賴關(guān)系,讓一個(gè)或多個(gè)觀察者對象監(jiān)察一個(gè)主題對象,需要的朋友可以參考下
    2016-01-01
  • java向文件末尾添加內(nèi)容示例分享

    java向文件末尾添加內(nèi)容示例分享

    本文為大家提供一個(gè)java向文件末尾添加內(nèi)容的示例分享,大家參考使用吧
    2014-01-01
  • Java實(shí)現(xiàn)的決策樹算法完整實(shí)例

    Java實(shí)現(xiàn)的決策樹算法完整實(shí)例

    這篇文章主要介紹了Java實(shí)現(xiàn)的決策樹算法,簡單描述了決策樹的概念、原理,并結(jié)合完整實(shí)例形式分析了java實(shí)現(xiàn)決策樹算法的相關(guān)操作技巧,代碼中備有較為詳盡的注釋便于理解,需要的朋友可以參考下
    2017-11-11
  • 使用SpringBoot內(nèi)置web服務(wù)器

    使用SpringBoot內(nèi)置web服務(wù)器

    這篇文章主要介紹了使用SpringBoot內(nèi)置web服務(wù)器操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java內(nèi)置GUI Frame類的使用

    Java內(nèi)置GUI Frame類的使用

    這篇文章主要介紹了Java內(nèi)置GUI Frame類的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序

    聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序

    這篇文章主要介紹了聊聊Spring AOP @Before @Around @After等advice的執(zhí)行順序,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • SpringBoot2.x入門教程之引入jdbc模塊與JdbcTemplate簡單使用方法

    SpringBoot2.x入門教程之引入jdbc模塊與JdbcTemplate簡單使用方法

    這篇文章主要介紹了SpringBoot2.x入門教程之引入jdbc模塊與JdbcTemplate簡單使用方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評論