spring数据深度校验/自定义校验

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

@Validated和@Valid校验

@Validated和@Valid配合可以进行对象的深层次校验。

@Valid 作用在方法,字段,构造器和参数上
@Validated 作用在类 方法 和参数上

当我们的接口参数中包含深层次的对象时 如:

BaseInfo时公共对象,字段含有校验的逻辑

@Data
public class BaseInfo{
    @NotEmpty(message="名称不能为空")
    private String name;

    @NotNull(message="年龄不能为空")
    private Integer age;

    @SexValidator  //自定义校验逻辑
    private Integer sex;
    
}

 Person为接口接收对象,属性中包含BaseInfo。

@Data
public class Person{
    //@Vlid表示对bseInfo要进行校验
    @Valid
    private BaserInfo baseInfo;

    @NotEmpty(message="年龄不能为空")
    private String localtion;

}
@RestController
public class testController{

    @PostMappering("/postTest")
    public void postTest(@Validated @RequestBody Person person){
        .......
    }
}

对于接口输入参数的一般属性。使用@Validated就可以验证。但是如果属性是自定义的对象类型。则需要加入@Valid 才能做到深层次的校验。

自定义校验

javax.validation.constraints 中包含了基本的字段校验逻辑。但是有时候我们需要自定义的逻辑。自定义的教育你需要实现ConstraintValidator接口。

public interface ConstraintValidator<A extends Annotation, T> {

	/**
	 * 初始化方法。
     * 在使用此实例进行验证之前调用此方法
     * 可以不实现
     *   
	 */
	default void initialize(A constraintAnnotation) {
	}

	/**
	 * 验证方法
	 */
	boolean isValid(T value, ConstraintValidatorContext context);
}

依赖:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency> 

先自定义一个注解:如ListValidator和 EquaValidator:

首先是数组校验:

/**
 * 数组校验注解
 */
@Documented
//执行校验的类(j校验器)
@Constraint(
        validatedBy = {ListValidator.class}
)
//注解的使用场景
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ListValue {
    //默认消息的路径
    String message() default "{com.atguigu.common.validator.ListValue.message}";
    //分组信息
    Class<?>[] groups() default {};
    //负载
    Class<? extends Payload>[] payload() default {};
    //注解携带的数据
    int[] values() default {};
}


/**
 *自定义数组校验方法
 */
public class ListValidator implements ConstraintValidator<ListValue,Integer> {
   private Set set =  new HashSet<Integer>();
   //初始化方法
	@Override
	public void initialize(ListValue constraintAnnotation) {
		int[] value = constraintAnnotation.values();
		if (value.length>0){
			for (int i : value) {
				set.add(i);
			}
		}

	}
	//校验方法
	@Override
	public boolean isValid(Integer integer, ConstraintValidatorContext constraintValidatorContext) {
		return set.contains(integer);
	}
}

相等校验:EqualValidtor:

@Documented
@Constraint(validatedBy = {EqualsValidator.class})
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface EqualsValue {
 
    String message() default "必须是xzh";

    String value default null;
 
    Class<?>[] groups() default { };
 
    Class<? extends Payload>[] payload() default { };
}


public class EqualsValidator implements ConstraintValidator<EqualsValue, String> {
       
    String defaultValue = null; 

    @Override
    public void initialize(ListValue constraintAnnotation) {
	     value = constraintAnnotation.value();
	}

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if(defaultValue != null && value != null ){
             return defaultValue.equals(value);
        }        
    }
}

之后我们就可以在自己需要校验的属性中配置校验数据了

@Data
public class BaseInfo{
    @NotEmpty(message="名称不能为空")
    private String name;

    @NotNull(message="年龄不能为空")
    private Integer age;

    @SexValidator  //自定义校验逻辑
    private Integer sex;

    @ListValue(values={1, 2, 3}, maessage="数组参数必须是1,2,3")
    private Integer lists;

    @EqualValue(value="123", message="数据必须是123")
    private String equalsValue;
    
}

参数校验不匹配会抛出异常org.springframework.web.bind.MethodArgumentNotValidException。我们可以在自定义的拦截器中拦截即可文章来源地址https://www.toymoban.com/news/detail-481226.html

到了这里,关于spring数据深度校验/自定义校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • spring数据深度校验/自定义校验

    @Validated和@Valid配合可以进行对象的深层次校验。 @Valid 作用在方法,字段,构造器和参数上 @Validated 作用在类 方法 和参数上 当我们的接口参数中包含深层次的对象时 如: BaseInfo时公共对象,字段含有校验的逻辑  Person为接口接收对象,属性中包含BaseInfo。 对于接口输入参数

    2024年02月08日
    浏览(25)
  • Spring Boot @Validated 和Javax的@Valid配合使用

    @Validation 和@Valid 常常配合使用对传输的参数进行数据校验的注解,并通过配置全局异常处理器进行合理化的提示,增加用户的体验 并且@Validated可以通过分组来指定什么时候触发什么样的参数校验(这里看一下就行,下面有说什么是分组) 其实不用这两个注解也可以完成对传

    2024年02月09日
    浏览(22)
  • spring参数校验@Validated及嵌套校验

    本文介绍项目中校验 @Validated的使用,主要分参数对象属性校验,嵌套校验,集合在对象属性中校验,集合作为参数校验。 controller层 测试输入 输出 这里作为参数,如果使用List接收是不起作用的,必须用ValidList,这个类中有标记 @Valid @Valid private ListE list = new ArrayList(); 如果在

    2024年02月09日
    浏览(37)
  • Springboot——@valid 做字段校验和自定义注解

    再项目开发中,针对前端传递的参数信息,有些接口中需要写大量的 if 判断,导致代码臃肿,不够优雅。 此时,可以使用 @Valid 实现基本的字段校验。 springboot 2.3之前 ,直接进行开发即可,无需引用额外的依赖 集成在 spring-boot-starter-web 中。 springboot 2.3之后 需要额外引入

    2023年04月26日
    浏览(50)
  • Spring Boot 中自定义数据校验注解

    在 Spring Boot 中,我们可以使用 JSR-303 数据校验规范来校验表单数据的合法性。JSR-303 提供了一些常用的数据校验注解,例如 @NotNull 、 @NotBlank 、 @Size 等。但是,在实际开发中,我们可能需要自定义数据校验注解来满足特定的需求。本文将介绍如何在 Spring Boot 中自定义数据校

    2024年02月10日
    浏览(48)
  • 如何优雅的写代码-替代大量if else的@valid、@validated注解

    @Valid 注解通常用于对象属性字段的规则检测,具体啥意思,下面让我娓娓道来: 下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 注解用法详解。 那么,首先,我们会有一个员工对象 Employee,如下 :首先我们会有一个员工对象 Employee,如下 :

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

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

    2024年02月02日
    浏览(30)
  • spring boot实现实体类参数自定义校验

    安装依赖项 1、新建实体类 2、新建验证类 3、在控制器中 3.1 首先写入方法 @InitBinder注解的作用是在控制器方法执行之前,先执行有 @InitBinder注解的方法,使用WebDataBinder 把新建的验证规则绑定 3.2 在控制器接口参数中

    2024年02月12日
    浏览(31)
  • Spring @Validated 失效分析

    最近在落地 DDD,希望对 command 进行参数校验,由于部分流量入口是 MQ,所以希望在应用层是用 @Validated 进行参数校验,结果。。。 Controller 中使用 @Validated @Validated 注解的作用这里就不多做介绍了,具体用法在网上应该有不少。 在之前使用 MVC 架构编码时,通常是将 @Validat

    2024年02月03日
    浏览(25)
  • java如何优雅的实现参数非空校验,快速实现参数非空校验,使用@valid实现参数非空校验

    在java项目接口中,有些必传参数需要进行非空校验,如果参数过多,代码会繁杂且冗余,如何优雅的对参数进行非空校验,下面是实现流程 用实体类接收参数,使用非空注解编辑参数内容 使用 @Valid 注解对参数进行拦截,整体进行非空校验 如果是SpringBoot项目,引入web开发包

    2024年02月08日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包