Springboot——@valid 做字段校验和自定义注解

这篇具有很好参考价值的文章主要介绍了Springboot——@valid 做字段校验和自定义注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

再项目开发中,针对前端传递的参数信息,有些接口中需要写大量的if判断,导致代码臃肿,不够优雅。

此时,可以使用@Valid实现基本的字段校验。

注意实现

  • springboot 2.3之前 ,直接进行开发即可,无需引用额外的依赖
    集成在spring-boot-starter-web中。
  • springboot 2.3之后 需要额外引入spring-boot-starter-validation依赖信息

测试环境

springboot 2.1.4

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

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

验证自带的注解

验证自带的注解,以及实现原理,可以移步到我的另一篇博客中,本篇博客不做过多的阐述。

做一个优雅的接口

自定义valid注解

官方提供的一些常用的注解,有时候并不能适合所有的开发需求。此时可以采取自定义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 = POrderParse.class) // 注解对应的处理类
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface POrder {
    // 默认提示语句
    String message() default "排序号不允许为空,且只允许是1到20的数字!";
    // 默认校验正则表达式
    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) {
        // 校验逻辑
        ConstraintValidatorContextImpl con = (ConstraintValidatorContextImpl) context;
        // 获取注解中的属性值
        Map<String, Object> maps = con.getConstraintDescriptor().getAttributes();
        // 获取设置的或者默认的正则表达式
        String regexp = (String) maps.get("regexp");

        // 获取数据值
        String param = String.valueOf(value);
        // 正则判断
        Pattern regexpVo = Pattern.compile(regexp);
        Matcher matcher = regexpVo.matcher(param);
        return matcher.matches();
    }
}

创建参数接收类,并增加字段注解

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

@Data
public class User {

    @POrder
    private Integer order;
}

接口中使用

创建一个测试接口,进行应用测试。

需要使用到@Valid注解标识

@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");
    }
)

自测环节

启动项目,进入swagger进行请求测试。

正常测试

传递满足正则要求的值,查看返回结果信息。

{
	"order": 10
}

Springboot——@valid 做字段校验和自定义注解

异常测试

参数中传递一个不满足正则表达式的值,观察返回信息。

{
	"order": 0
}

Springboot——@valid 做字段校验和自定义注解

自定义全局异常监听

每次返回这样的报错信息不够直观,此时可以自定义全局异常监听,如下所示:

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("字段合法性校验异常:[{}]", e.getMessage());
        // getFieldError() 和 getDefaultMessage() 的区别
        return CommonResult.error( Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage(), null);
    }
}

重启项目,再次异常测试:
Springboot——@valid 做字段校验和自定义注解

扩展

递归参数下valid不识别的坑

递归参数的意思就是接收对象是一个类,假设是DataScope,但是在这个接收类中,还有一个List<User>这个参数变量,并且User中依旧还含有需要valid校验的字段属性。

再自定义一个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("校验");
        // 故意返回false,触发异常
        return false;
    }
}

然后再请求参数接收对象中,定义如下格式:

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;
}

重启项目,传递正常的 order 值,观察Address 类中的 phoneNum 是否触发valid校验。

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

Springboot——@valid 做字段校验和自定义注解
发现并未触发对应的valid校验。

解决方式很简单,没有触发说明注解无效,接口中定义@Valid User 是对user对象进行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;
}

重启项目,继续按照上面的传参,观察响应信息。
Springboot——@valid 做字段校验和自定义注解文章来源地址https://www.toymoban.com/news/detail-426139.html

到了这里,关于Springboot——@valid 做字段校验和自定义注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot-- 注解字段校验,并统一设置返回值

    引包: import org.springframework.validation.annotation.Validated; 规则 @AssertFalse Boolean,boolean 验证注解的元素值是false @AssertTrue Boolean,boolean 验证注解的元素值是true @NotNull 任意类型 验证注解的元素值不是null @Null 任意类型 验证注解的元素值是null @Min(value=值) BigDecimal,BigInteger, byte,short,

    2024年02月11日
    浏览(51)
  • SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)

    ①、引入依赖 ②、创建实体类 ③、建立控制层 ④、进行测试 作为测试demo,到这里就可以直接测试了 ①、@NotNull ,@NotEmpty 和 @NotBlank 三者的区别 @NotNull、@NotEmpty 和 @NotBlank 都是用于Java中进行参数校验的注解,它们之间的区别如下: @NotNull 注解用于限制参数不能为null。 @N

    2024年02月07日
    浏览(47)
  • @NotNull @NotEmpty @NotBlank java校验注解 validation

    1.@NotNull 不能为 null,但可以为 empty,一般用于判空 Integer 类型等基本数据类型,而且被其标注的字段可以使用 @size、@Max、@Min 对数值进行大小的控制 2.@NotEmpty 不能为 null,且长度必须大于 0,一般用于集合类或者数组上,也有人用于String(不推荐) 3.@NotBlank 只能作用在接收的

    2024年02月10日
    浏览(38)
  • 【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证?

    请先看看下面代码:(简单举个例子,代码并不规范) 以上代码主要是为了对用户user实体进行条件验证。 但是那么多的if, 写得纯纯得小白一个,也使得代码显得臃肿不美观不优雅! 接下来,让我们学习使用优雅的参数验证@Validated! @Valid和@Validated是Spring Validation框架提供

    2024年02月02日
    浏览(43)
  • SpringBoot参数校验@Validated、@Valid

    在实际开发中,前端校验并不安全,任何人都可以通过接口来调用我们的服务,就算加了一层token的校验,有心人总会转空子,来传各式各样错误的参数,如果后端不校验,导致数据库数据混乱、特别是关于金额的数据,可能一个接口把公司都给干倒了 0、返回类(可以不用看

    2024年01月23日
    浏览(41)
  • 【业务功能篇78】微服务-前端后端校验- 统一异常处理-JSR-303-validation注解

    5. 前端校验 我们在前端提交的表单数据,我们也是需要对提交的数据做相关的校验的 Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可 校验的页面效果 前端数据校验就搞定了。后端校验也是不可

    2024年02月11日
    浏览(103)
  • element ui 自定义校验不进入表单validate验证

    解决表单提交验证时自定义的校验规则错误问题 错误代码: 这段代码中只有value为空、不是整数才执行,当为整数的时候没有返回对于的执行函数callback(); 所以为整数时返回执行函数callback() 正确代码: 结束语: 希望这篇文章能帮助到大家,如有不对之处,还请指正。愿我

    2024年02月11日
    浏览(52)
  • Springboot @Validated注解详细说明

    在Spring Boot中,@Validated注解用于验证请求参数。它可以应用在Controller类或方法上 1、引入依赖 2、参数说明与使用示例 注解 验证的数据类型 描述 @NotNull 任意类型 验证属性不能为null @NotBlank 字符串 验证字符串属性不能为空且长度必须大于0 @Size(min,max ) CharSequence Collection Map

    2024年02月14日
    浏览(37)
  • java 自定义xss校验注解实现

    自定义一个注解@Xss。名字随意 validator校验类:XssValidator。这个校验类要和上面的@Xss注解上的 @Constraint(validatedBy = { XssValidator.class })对应 具体使用在某个字段上加上注解;形如: 然后在控制层中增加@Validated注解校验就可以了  以上代码实现后。会自动针对某些增加了@Xss字符

    2024年02月14日
    浏览(46)
  • Spring Boot入门(23):记录接口日志再也不难!用AOP和自定义注解给Spring Boot加上日志拦截器!

            在上两期中,我们着重介绍了如何集成使用 Logback 与 log4j2 日志框架的使用,今天我们讲解的主题依旧跟日志有关,不过不是使用何种开源框架,而是自己动手造。         Spring的核心之一AOP;AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包