实战经验分享之:使用@Validated和@Valid进行数据校验

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

数据永远式不可信的,不能只依赖前端进行参数校验,后端也需要做参数校验,非法伪造数据完全可以越过前端,传入非法数据进入服务端,那么数据的合法性就显得尤为重要。

在 Java 开发中,数据校验是确保数据合法性和完整性的关键步骤。为了简化数据校验的过程,Java提供了两个重要的注解:@Validated 和 @Valid,为开发者提供了一套强大的数据校验框架。本篇博客将介绍 @Validated 和 @Valid 注解的作用。

前言

大家在开发中,多多少少都有过数据校验以及各种接口入参的校验,会在 service 层写入大量的 DTO校验逻辑,而且每个 service 类都充斥着大量的校验代码,如下所示:

@Service
public class xxxxService {

  public void getUserInfo (RequestDto requestDto) throws Exception {
        // 对requestDto里面的参数进行校验
      if(ObjectUtils.isEmpty(requestDto) || StringUtils.isEmpty(requestDto.getName)) {
            throw new Exception("返回参数校验的失败信息...");
      }

      // 业务逻辑...
  }
}

上面这还只是对其中的某个参数进行校验,如果这个 Dto 类中有十几个参数都需要进行合法性校验,那怎么办?写大量的 if 语句进行校验吗?可以是可以,但是这样代码会显得非常的不好看, 那么接下来我会介绍一下今天的两个注解进行参数校验:使用 @Validated 和 @Valid 进行数据校验。

@Validated注解的作用

@Validated 注解是 Spring 框架提供的,在 Spring 应用中通常与 @Valid 注解结合使用。它常见的用于在 Spring Controller层入口就进行数据校验。与 @Valid 注解不同的是,@Validated 注解可以标记在类或方法上。

@Valid注解的作用

@Valid 是 Java Bean Validation中最常用的注解之一。它可以应用于方法参数、方法返回值或者字段上。@Valid 的作用是告诉Java Bean Validation框架,在执行方法或操作之前,需要对被注解的对象进行数据校验。

当我们在一个方法的参数上使用 @Valid 注解时,框架会对传入该参数的对象进行校验。如果校验失败,框架会返回定义的异常信息,其中包含了校验失败的详细信息,例如字段名、校验规则等。

如何使用@Validated和@Valid进行数据校验

不废话,直接上代码

// 一般 @Validated 注解直接在controller 层进行使用,在接口请求的地方使用 @Valid 注解进行参数校验,这两个需要联合使用,如果只使用 @Valid 注解是没有用的。

@Validated
@RestController
@RequestMapping("/checkController/demo")
public interface checkController {

    @PostMapping("/getUserInfo")
    ResponseVO getUserInfo(@RequestBody @Valid RequestDto dto);
}

接下来看看 RequestDto 类里面校验是如何做的:可以进行非空判断、可以进行正则校验、可以进行集合的大小校验等。

@Data
public class RequestDto {

    @NotBlank(message = "姓名字段不能为空,请重新输入")
    private String name;

    @NotBlank(message = "id不能为空,请重新输入")
    private String id;

    // 这里可以进行各类的正则校验
    @Pattern(regexp = "0|1", message = "status状态按钮只能是0或者1,请重新输入")
    private String status;

    @Size(max = 1000, message = "用户列表长度最长不超过1000,请重新填写") // 默认min 为 0
    private List<String> userIds;

    private List<User> userList;
}

接下来介绍下嵌套校验,进行套娃式的校验:就是对象里面嵌套对象,对象再嵌套对象,如何进行对后一个对象的校验等操作,还是以上面的类为例,对最后的 userList 里面的参数进行校验:

@Data
public class RequestDto {

    @NotBlank(message = "姓名字段不能为空,请重新输入")
    private String name;

    @NotBlank(message = "id不能为空,请重新输入")
    private String id;

    // 这里可以进行各类的正则校验
    @Pattern(regexp = "0|1", message = "status状态按钮只能是0或者1,请重新输入")
    private String status;

    @Size(max = 1000, message = "用户列表长度最长不超过1000,请重新填写") // 默认min 为 0
    private List<String> userIds;

    // 在每个对象里面加上 @Valid 注解
    private List<@Valid User> userList;
}

User类:

@Data
public class User {

    private String id;

    // 在每个对象里面加上 @Valid 注解
    private List<@Valid Demo> list;
}

Demo类:

@Data
public class Demo {

    @NotBlank(message = "id不能为空,请重新输入")
    private String id;

    // ... 无限套娃
}

总结

在上面笔者介绍了 @Validated 和 @Valid 注解的作用及使用方法。@Validated 注解主要用于Spring controller 层,在类或方法上进行数据校验,而 @Valid 注解则用于普通 Java 类的数据校验。这两个注解结合 Java Bean Validation 为我们提供了一种简单而强大的数据校验解决方案,帮助我们确保数据的合法性和完整性,从而增加应用程序的稳定性和可靠性。

建议在 Spring 项目中广泛使用 @Validated 和 @Valid 注解,让框架帮我们进行校验,结合Java Bean Validation的校验规则,以保证应用程序的数据处理过程安全可靠。

@Valid 注解里面有很多的校验方法,笔者在这篇博客只是简单使用里其中的一两个进行示例,具体的校验大家根据实际情况来。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@Validated注解用于在Spring框架中对方法参数进行校验。当我们使用@Validated注解时,它会触发Spring校验机制,根据参数上的校验注解(如@NotNull、@Size等)来验证参数的合法性。然而,@Validated注解对于List类型的参数校验有一些限制。 引用\[2\]中提到的问题是,当我们使用@Validated注解校验一个List类型的参数时,校验只会应用于List本身,而不会校验List内部的实体对象。这是因为List是一个集合,而不是一个具体的实体对象,所以校验机制无法直接对List内部的实体对象进行校验。 解决这个问题的方法是,我们可以使用嵌套校验(Nested Validation)来对List内部的实体对象进行校验。具体做法是,在List参数使用@Valid注解,这样就会触发对List内部实体对象的校验。 例如,我们可以将方法参数的定义修改为以下形式: ```java public void validateList(@RequestBody @Valid List<AClass> aObjectList) { // 校验逻辑 } ``` 在这个例子中,我们使用了@Valid注解来对List内部的AClass对象进行校验。这样,当我们调用validateList方法时,Spring会自动触发对List内部的AClass对象的校验。 总结起来,对于使用@Validated注解校验List类型的参数,我们需要使用@Valid注解来实现嵌套校验,以确保对List内部的实体对象进行校验。 #### 引用[.reference_title] - *1* [@Validated和@Valid校验参数、级联属性、List](https://blog.csdn.net/coolcoffee168/article/details/111059895)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [@validated 验证 List](https://blog.csdn.net/u011060906/article/details/108253380)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是三叔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值