国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Springboot——@valid 做字段校驗(yàn)和自定義注解

這篇具有很好參考價值的文章主要介紹了Springboot——@valid 做字段校驗(yàn)和自定義注解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

前言

再項(xiàng)目開發(fā)中,針對前端傳遞的參數(shù)信息,有些接口中需要寫大量的if判斷,導(dǎo)致代碼臃腫,不夠優(yōu)雅。

此時,可以使用@Valid實(shí)現(xiàn)基本的字段校驗(yàn)。

注意實(shí)現(xiàn)

  • springboot 2.3之前 ,直接進(jìn)行開發(fā)即可,無需引用額外的依賴
    集成在spring-boot-starter-web中。
  • springboot 2.3之后 需要額外引入spring-boot-starter-validation依賴信息

測試環(huán)境

springboot 2.1.4

如果你的springboot版本高于 2.3,需要額外引入下列依賴:

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

驗(yàn)證自帶的注解

驗(yàn)證自帶的注解,以及實(shí)現(xiàn)原理,可以移步到我的另一篇博客中,本篇博客不做過多的闡述。

做一個優(yōu)雅的接口

自定義valid注解

官方提供的一些常用的注解,有時候并不能適合所有的開發(fā)需求。此時可以采取自定義valid的方式,實(shí)現(xiàn)其應(yīng)有的功能。

自定義注解和處理類

創(chuàng)建一個自定義的注解

檢查排序號是否輸入,以及是否滿足要求。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = POrderParse.class) // 注解對應(yīng)的處理類
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface POrder {
    // 默認(rèn)提示語句
    String message() default "排序號不允許為空,且只允許是1到20的數(shù)字!";
    // 默認(rèn)校驗(yàn)正則表達(dá)式
    String regexp() default "^([1-9])|([1]\\d)|20$";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };

}

定義注解后,還需要定義其指定的處理類,如下所示:

import org.hibernate.validator.internal.engine.constraintvalidation.ConstraintValidatorContextImpl;
import org.springframework.stereotype.Component;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Component
public class POrderParse implements ConstraintValidator<POrder,Object> {

    @Override
    public void initialize(POrder constraintAnnotation) {
        System.out.println("my para order validator init");
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        // 校驗(yàn)邏輯
        ConstraintValidatorContextImpl con = (ConstraintValidatorContextImpl) context;
        // 獲取注解中的屬性值
        Map<String, Object> maps = con.getConstraintDescriptor().getAttributes();
        // 獲取設(shè)置的或者默認(rèn)的正則表達(dá)式
        String regexp = (String) maps.get("regexp");

        // 獲取數(shù)據(jù)值
        String param = String.valueOf(value);
        // 正則判斷
        Pattern regexpVo = Pattern.compile(regexp);
        Matcher matcher = regexpVo.matcher(param);
        return matcher.matches();
    }
}

創(chuàng)建參數(shù)接收類,并增加字段注解

import cn.xj.bi.volid.MyPhone;
import cn.xj.bi.volid.POrder;
import lombok.Data;

@Data
public class User {

    @POrder
    private Integer order;
}

接口中使用

創(chuàng)建一個測試接口,進(jìn)行應(yīng)用測試。

需要使用到@Valid注解標(biāo)識

@RestController
@RequestMapping("/test1")
@Api(tags = "測試")
public class TestController {

    @PostMapping("/demo4")
    @ApiOperation(value = "demo4")
    public CommonResult<String> test4(@RequestBody @Valid User user){
        return CommonResult.success("6666");
    }
)

自測環(huán)節(jié)

啟動項(xiàng)目,進(jìn)入swagger進(jìn)行請求測試。

正常測試

傳遞滿足正則要求的值,查看返回結(jié)果信息。

{
	"order": 10
}

Springboot——@valid 做字段校驗(yàn)和自定義注解

異常測試

參數(shù)中傳遞一個不滿足正則表達(dá)式的值,觀察返回信息。

{
	"order": 0
}

Springboot——@valid 做字段校驗(yàn)和自定義注解

自定義全局異常監(jiān)聽

每次返回這樣的報錯信息不夠直觀,此時可以自定義全局異常監(jiān)聽,如下所示:

import cn.xj.bi.vo.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Objects;

@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public CommonResult handleScopeFiledException(MethodArgumentNotValidException e) {
        log.error("字段合法性校驗(yàn)異常:[{}]", e.getMessage());
        // getFieldError() 和 getDefaultMessage() 的區(qū)別
        return CommonResult.error( Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage(), null);
    }
}

重啟項(xiàng)目,再次異常測試:
Springboot——@valid 做字段校驗(yàn)和自定義注解

擴(kuò)展

遞歸參數(shù)下valid不識別的坑

遞歸參數(shù)的意思就是接收對象是一個類,假設(shè)是DataScope,但是在這個接收類中,還有一個List<User>這個參數(shù)變量,并且User中依舊還含有需要valid校驗(yàn)的字段屬性。

再自定義一個valid注解,如下所示:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = {MyPhoneValidtor.class})
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyPhone {
    String message();
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

}

valid注解具體處理類:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class MyPhoneValidtor implements ConstraintValidator<MyPhone,Object> {
    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        System.out.println("校驗(yàn)");
        // 故意返回false,觸發(fā)異常
        return false;
    }
}

然后再請求參數(shù)接收對象中,定義如下格式:

import cn.xj.bi.volid.POrder;
import lombok.Data;

@Data
public class User {
    @POrder
    private Integer order;
    
    private Address address;
}
import cn.xj.bi.volid.MyPhone;
import lombok.Data;
import java.io.Serializable;

@Data
public class Address implements Serializable {
    @MyPhone(message = "這只是一個測試")
    private String phoneNum;
}

重啟項(xiàng)目,傳遞正常的 order 值,觀察Address 類中的 phoneNum 是否觸發(fā)valid校驗(yàn)。

{
	"order": 10,
        "address":{
              "phoneNum":""
        }
}

Springboot——@valid 做字段校驗(yàn)和自定義注解
發(fā)現(xiàn)并未觸發(fā)對應(yīng)的valid校驗(yàn)。

解決方式很簡單,沒有觸發(fā)說明注解無效,接口中定義@Valid User 是對user對象進(jìn)行valid處理,但對象類型的并不在列,只需要在對象類型的變量上增加@Valid注解即可。

import cn.xj.bi.volid.POrder;
import lombok.Data;

import javax.validation.Valid;

@Data
public class User {
    @POrder
    private Integer order;
    
    @Valid  // 迭代valid
    private Address address;
}

重啟項(xiàng)目,繼續(xù)按照上面的傳參,觀察響應(yīng)信息。
Springboot——@valid 做字段校驗(yàn)和自定義注解文章來源地址http://www.zghlxwxcb.cn/news/detail-426139.html

到了這里,關(guān)于Springboot——@valid 做字段校驗(yàn)和自定義注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Springboot-- 注解字段校驗(yàn),并統(tǒng)一設(shè)置返回值

    Springboot-- 注解字段校驗(yàn),并統(tǒng)一設(shè)置返回值

    引包: import org.springframework.validation.annotation.Validated; 規(guī)則 @AssertFalse Boolean,boolean 驗(yàn)證注解的元素值是false @AssertTrue Boolean,boolean 驗(yàn)證注解的元素值是true @NotNull 任意類型 驗(yàn)證注解的元素值不是null @Null 任意類型 驗(yàn)證注解的元素值是null @Min(value=值) BigDecimal,BigInteger, byte,short,

    2024年02月11日
    瀏覽(33)
  • SpringBoot 使用validator進(jìn)行參數(shù)校驗(yàn)(實(shí)例操作+注意事項(xiàng)+自定義參數(shù)校驗(yàn))

    SpringBoot 使用validator進(jìn)行參數(shù)校驗(yàn)(實(shí)例操作+注意事項(xiàng)+自定義參數(shù)校驗(yàn))

    ①、引入依賴 ②、創(chuàng)建實(shí)體類 ③、建立控制層 ④、進(jìn)行測試 作為測試demo,到這里就可以直接測試了 ①、@NotNull ,@NotEmpty 和 @NotBlank 三者的區(qū)別 @NotNull、@NotEmpty 和 @NotBlank 都是用于Java中進(jìn)行參數(shù)校驗(yàn)的注解,它們之間的區(qū)別如下: @NotNull 注解用于限制參數(shù)不能為null。 @N

    2024年02月07日
    瀏覽(27)
  • @NotNull @NotEmpty @NotBlank java校驗(yàn)注解 validation

    1.@NotNull 不能為 null,但可以為 empty,一般用于判空 Integer 類型等基本數(shù)據(jù)類型,而且被其標(biāo)注的字段可以使用 @size、@Max、@Min 對數(shù)值進(jìn)行大小的控制 2.@NotEmpty 不能為 null,且長度必須大于 0,一般用于集合類或者數(shù)組上,也有人用于String(不推薦) 3.@NotBlank 只能作用在接收的

    2024年02月10日
    瀏覽(19)
  • 【優(yōu)雅的參數(shù)驗(yàn)證@Validated】@Validated參數(shù)校驗(yàn)的使用及注解詳解——你還在用if做條件驗(yàn)證?

    【優(yōu)雅的參數(shù)驗(yàn)證@Validated】@Validated參數(shù)校驗(yàn)的使用及注解詳解——你還在用if做條件驗(yàn)證?

    請先看看下面代碼:(簡單舉個例子,代碼并不規(guī)范) 以上代碼主要是為了對用戶user實(shí)體進(jìn)行條件驗(yàn)證。 但是那么多的if, 寫得純純得小白一個,也使得代碼顯得臃腫不美觀不優(yōu)雅! 接下來,讓我們學(xué)習(xí)使用優(yōu)雅的參數(shù)驗(yàn)證@Validated! @Valid和@Validated是Spring Validation框架提供

    2024年02月02日
    瀏覽(28)
  • SpringBoot參數(shù)校驗(yàn)@Validated、@Valid

    SpringBoot參數(shù)校驗(yàn)@Validated、@Valid

    在實(shí)際開發(fā)中,前端校驗(yàn)并不安全,任何人都可以通過接口來調(diào)用我們的服務(wù),就算加了一層token的校驗(yàn),有心人總會轉(zhuǎn)空子,來傳各式各樣錯誤的參數(shù),如果后端不校驗(yàn),導(dǎo)致數(shù)據(jù)庫數(shù)據(jù)混亂、特別是關(guān)于金額的數(shù)據(jù),可能一個接口把公司都給干倒了 0、返回類(可以不用看

    2024年01月23日
    瀏覽(22)
  • 【業(yè)務(wù)功能篇78】微服務(wù)-前端后端校驗(yàn)- 統(tǒng)一異常處理-JSR-303-validation注解

    【業(yè)務(wù)功能篇78】微服務(wù)-前端后端校驗(yàn)- 統(tǒng)一異常處理-JSR-303-validation注解

    5. 前端校驗(yàn) 我們在前端提交的表單數(shù)據(jù),我們也是需要對提交的數(shù)據(jù)做相關(guān)的校驗(yàn)的 Form 組件提供了表單驗(yàn)證的功能,只需要通過 rules 屬性傳入約定的驗(yàn)證規(guī)則,并將 Form-Item 的 prop 屬性設(shè)置為需校驗(yàn)的字段名即可 校驗(yàn)的頁面效果 前端數(shù)據(jù)校驗(yàn)就搞定了。后端校驗(yàn)也是不可

    2024年02月11日
    瀏覽(19)
  • element ui 自定義校驗(yàn)不進(jìn)入表單validate驗(yàn)證

    解決表單提交驗(yàn)證時自定義的校驗(yàn)規(guī)則錯誤問題 錯誤代碼: 這段代碼中只有value為空、不是整數(shù)才執(zhí)行,當(dāng)為整數(shù)的時候沒有返回對于的執(zhí)行函數(shù)callback(); 所以為整數(shù)時返回執(zhí)行函數(shù)callback() 正確代碼: 結(jié)束語: 希望這篇文章能幫助到大家,如有不對之處,還請指正。愿我

    2024年02月11日
    瀏覽(24)
  • Springboot @Validated注解詳細(xì)說明

    Springboot @Validated注解詳細(xì)說明

    在Spring Boot中,@Validated注解用于驗(yàn)證請求參數(shù)。它可以應(yīng)用在Controller類或方法上 1、引入依賴 2、參數(shù)說明與使用示例 注解 驗(yàn)證的數(shù)據(jù)類型 描述 @NotNull 任意類型 驗(yàn)證屬性不能為null @NotBlank 字符串 驗(yàn)證字符串屬性不能為空且長度必須大于0 @Size(min,max ) CharSequence Collection Map

    2024年02月14日
    瀏覽(21)
  • java 自定義xss校驗(yàn)注解實(shí)現(xiàn)

    java 自定義xss校驗(yàn)注解實(shí)現(xiàn)

    自定義一個注解@Xss。名字隨意 validator校驗(yàn)類:XssValidator。這個校驗(yàn)類要和上面的@Xss注解上的 @Constraint(validatedBy = { XssValidator.class })對應(yīng) 具體使用在某個字段上加上注解;形如: 然后在控制層中增加@Validated注解校驗(yàn)就可以了 ?以上代碼實(shí)現(xiàn)后。會自動針對某些增加了@Xss字符

    2024年02月14日
    瀏覽(20)
  • Spring Boot入門(23):記錄接口日志再也不難!用AOP和自定義注解給Spring Boot加上日志攔截器!

    Spring Boot入門(23):記錄接口日志再也不難!用AOP和自定義注解給Spring Boot加上日志攔截器!

    ? ? ? ? 在上兩期中,我們著重介紹了如何集成使用 Logback?與?log4j2?日志框架的使用,今天我們講解的主題依舊跟日志有關(guān),不過不是使用何種開源框架,而是自己動手造。 ? ? ? ? Spring的核心之一AOP;AOP翻譯過來叫面向切面編程, 核心就是這個切面. 切面表示從業(yè)務(wù)邏輯中

    2024年02月11日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包