使用@NotNull等注解,来对实体类的属性进行判定,减小冗余代码

2023-12-15 09:40:33

一般情况下前端会对入参进行校验,包括非空、大小、长度、正则等;而这个步骤后端在接参时依然不能省略,在前端传过来后,最基础的方案是一个一个使用if校验:

但这样会平白多出很多冗余代码,会让代码非常不美观,这里,就可以使用?javax.validation.constraints包下的各个注解来对实体类中的字段进行自动校验了;

并且还可以将createupdate多个接口进行不同的校验规则,各种非空、长度、大学、正则以及报错信息的定义可以全部写在实体类里面,这样不对代码业务层进行干扰,使代码看起来更简洁

下面,就从零开始一步一步用起来

一、添加依赖

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

二、给属性添加注解

注意导包需要?

import javax.validation.constraints.NotNull;

三、Controller上面加注解

@Validated

四、方法调取

可以看到刚刚加过@NotNull注解的字段如果入参是空,就会直接报错

五、自定义报错信息

一般情况下需要用此注解校验的字段会有多个,所以,可以在其后面自定义报错信息

@NotNull(message = "<行业分类>不能为空!")

测试结果:

六、给create和update添加校验分组来分别校验

在create和update两个方法校验时,同一个字段会有不同的校验规则,例如主键id在create时不用传,而update时是必传,这里就可以添加分组来分别校验:

首先在实体类中定义两个接口表示:

/* 现在分组校验 */
public @interface Create {}

/* 修改分组校验 */
public @interface Update {}
接口:

七、

现在被?实体类.Create.class标记的add接口就只校验Create标记过的字段guildType,而不校验Update标记的字段checkMsg

checkMsg为空时也不校验,而guildType为空时就报错

??

而另一半被?实体类.Update.class标记的put接口就只校验Update标记的字段checkMsg,而不校验

Create标记过的字段guildType,?guildType为空时也不校验,而checkMsg为空时就报错

除此之外还有其他各种注解使用,举一反三用法都大差不差,

注意导包时用? javax.validation.constraints.某注解? ?即可

各自作用详见下表:

注解说明
@Null被注释的元素必须为null
@NotNull被注释的元素不能为null
@AssertTrue被注释的元素必须为true
@AssertFalse被注释的元素必须为false
@Min(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value)被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max,min)被注释的元素的大小必须在指定的范围内。
@Digits(integer,fraction)被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past被注释的元素必须是一个过去的日期
@Future被注释的元素必须是一个将来的日期
@Pattern(value)被注释的元素必须符合指定的正则表达式。
@Email被注释的元素必须是电子邮件地址
@Length被注释的字符串的大小必须在指定的范围内
@NotEmpty被注释的字符串必须非空
@Range被注释的元素必须在合适的范围内

文章来源:https://blog.csdn.net/SSHLY3/article/details/134999629
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。