springboot做自定义校验注解

目录

自定义校验注解的实现

注意:

首先,我们需要自定义一个校验注解:

注解含义:

@Target({ElementType.FIELD})

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy = PhoneValidator.class)

校验注解逻辑实现类:

使用自定义校验注解:

控制器方法:


        有时候我们在接收前端产给我们数据的时候需要进行一些校验,部分校验可以通过已有的注解进行直接使用,但是仍存在一些需求是现有注解没有提供的,所以就需要我们自定义校验注解来实现我们需要的功能,那接下来就来看看自定义校验注解是怎么实现的吧~

要实现一个自定义校验注解,主要是有两步。一是注解本身,二是校验逻辑实现类

首先,我们来看一下校验注解的一个流程:

自定义校验注解的实现

现在我们以校验传过来的参数是否为正整数来实现自定义校验注解。

如下,我的实体类中有这样一个字段:(此处不能直接将类型设置为int型,不然前面无论传来什么值都会将其值修改为一个整型,会破坏数据的真实性)

注意:

1、此处不能直接使用@Pattern注解,因为这个注解只试用在类型为String的参数上;

2、不能使用@Digits注解,@Digits(integer = 1, fraction = 0, message = "数据精度只能是非负整数")

//    integer = 3: 这意味着数字的整数部分应该有3位。换句话说,该数字应该是一个千位数。
//fraction = 0: 这意味着数字的小数部分应该为0。换句话说,该数字应该是一个整数,而不是一个带有小数部分的数。
//message = "数据精度只能是非负整数": 这是在验证失败时显示的消息。在本例中,如果提供的数字不符合指定的精度要求,则会返回这条消息。

这个注解或根据你的要求自动将你传来的值进行四舍五入成整型。

首先,我们需要自定义一个校验注解:
import com.datacommon.ParameterValidation.NonNegativeIntegerValidator;

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;

//校验字段必须为非负整数
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NonNegativeIntegerValidator.class)
public @interface IntegerParam {
    String message() default "整数型字段必须为非负整数";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
注解含义:
@Target({ElementType.FIELD})

  注解是指定当前自定义注解可以使用在哪些地方,这里仅仅让他可以使用属性上。但还可以使用在更多的地方,比如说方法上、构造器上等等。

  • TYPE - 类,接口(包括注解类型)或枚举
  • FIELD - 字段(包括枚举常量)
  • METHOD - 方法
  • PARAMETER - 参数
  • CONSTRUCTOR - 构造函数
  • LOCAL_VARIABLE - 局部变量
  • ANNOTATION_TYPE -注解类型
  • PACKAGE - 包
  • TYPE_PARAMETER - 类型参数
  • TYPE_USE - 使用类型
@Retention(RetentionPolicy.RUNTIME)

  指定当前注解保留到运行时。保留策略有下面三种:

  • SOURCE - 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃。
  • CLASS - 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期。
  • RUNTIME - 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在。
@Constraint(validatedBy = PhoneValidator.class)

  指定了当前注解使用哪个校验类来进行校验。

校验注解逻辑实现类:
import com.datacommon.ParameterValidation.paramInterface.IntegerParam;

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


/**
 * 自定义参数校验规则
 * 校验穿进来的参数是否为非负整数
 */
public class NonNegativeIntegerValidator implements ConstraintValidator<IntegerParam, Double> {

    @Override
    public void initialize(IntegerParam constraintAnnotation) {
    }



    @Override
    public boolean isValid(Double value, ConstraintValidatorContext context) {
        System.out.println(value);
        if(value.toString().contains(".0")){
            return true;
        }
        return !value.toString().contains(".") && !value.toString().contains("-");
    }
}
使用自定义校验注解:

使用我们自定义的校验注解就和普通的注解一样,只需要在相关字段上加上我们的注解名称就行了~

控制器方法:

记住要在使用到校验类的时候加上@Valid注解

  • 20
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Boot 提供了一种基于注解的方式来实现校验,即使用 `javax.validation` 标准规范中的注解来实现校验。如果需要自定义校验规则,可以按照以下步骤进行: 1. 创建自定义注解 ```java @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = MyValidator.class) public @interface MyValidation { String message() default "Invalid field"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 2. 创建自定义校验器 ```java public class MyValidator implements ConstraintValidator<MyValidation, String> { @Override public void initialize(MyValidation constraintAnnotation) { // 初始化 } @Override public boolean isValid(String value, ConstraintValidatorContext context) { // 自定义校验逻辑 return value != null && value.startsWith("prefix"); } } ``` 3. 在需要校验字段上添加自定义注解 ```java public class MyEntity { @MyValidation private String myField; // getter/setter } ``` 4. 在 Controller 中使用 `@Validated` 注解进行校验 ```java @RestController @RequestMapping("/my-entity") @Validated public class MyController { @PostMapping public MyEntity create(@RequestBody @Valid MyEntity entity) { // 创建实体 } } ``` 在上面的示例中,`MyValidation` 注解和 `MyValidator` 校验器实现了一个自定义校验规则,用于判断字符串是否以 "prefix" 开头。在 `MyEntity` 实体类中,使用了 `@MyValidation` 注解来标注需要校验字段。在 `MyController` 中,使用了 `@Validated` 注解来开启校验,并在 `create()` 方法中使用 `@RequestBody @Valid` 注解来对请求体进行校验。 以上就是使用 Spring Boot 自定义校验规则的步骤。需要注意的是,自定义校验注解需要使用 `@Constraint` 注解进行标注,并指定校验器的实现类。校验器需要实现 `ConstraintValidator` 接口,并指定校验注解校验字段的类型。在校验逻辑中,可以使用 `ConstraintValidatorContext` 对象来进行错误信息的设置。在 Controller 中,需要使用 `@Validated` 注解开启校验,并在需要校验参数上使用 `@Valid` 注解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银氨溶液

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值