【问题标题】:WHat is the use of @Valid when @NonNull does the job for us?当@NonNull 为我们工作时,@Valid 有什么用?
【发布时间】:2022-01-19 00:13:24
【问题描述】:

控制器中的代码 -

@PostMapping("/employees")
    public Employee saveEmployee(@Valid @RequestBody Employee employee) {
        return employeeService.saveEmployee(employee);
    }

实体对象 -

@NotNull(message = "Department must not be null")
@Column(name = "department")
private String department;

假设我传递了一个部门字段为空的项目。 @NonNull 在这种情况下会抛出异常。但是我已经看到 @Valid 被用于相同的目的。有人可以详细说明为什么除了@NonNull 之外还需要使用@Valid 吗?

【问题讨论】:

  • 您是否尝试删除@Valid 并发送空部门?
  • 是的。我得到一个例外。但只是一个不同的。
  • 我猜在这种情况下你会从数据库中得到一个说你不能插入空值。需要@Valid 告诉 SpringBoot 自动引导默认的 JSR 380 实现(如 Hibernate Validator)并验证参数。没有它@NotNull 不被考虑。
  • 编辑了问题。现在,当我删除有效注释并发送一个空部门时,我得到部门不能为空作为输出。那么这如何在数据库中得到验证呢?我认为这是使用 NonNull 注释得到验证
  • 那么您可能在实体本身中有@Validated@Valid 注释。没有它,验证就不会启动。

标签: spring-boot jpa


【解决方案1】:

如果你省略了@Valid,Spring 将省略 web 层的验证。这基本上意味着您的控制器不会触发验证。当在 @ModelAttribute@RequestBody 带注释的方法参数上找到 @Valid(adted) 注释时,验证由 RequestMappingHandlerAdapter 完成。

JPA 还将使用已配置的验证器和触发器验证。因此,在写入数据库时​​将引发验证异常。您可以在 application.properties(或 YAML 等效项)中使用 spring.jpa.properties.javax.persistence.validation.mode=none 禁用此功能。禁用两者时,将不会进行验证。在这种情况下,您只希望该列不允许为 null 的数据库约束。

所以验证仍然完成但是完成验证的位置不同。由于存在差异,您也会得到不同的异常。

您必须想知道您是否真的想在持久化实体时执行此操作,可能会执行一些复杂/耗时的业务逻辑,或者在提交表单时快速执行此操作。

【讨论】:

    【解决方案2】:

    为了使对象可以在 Controller 层进行验证,您需要 @Valid(或 @Validated)来触发其验证。

    您可以在以下在线资源上阅读更多相关信息:

    你可以在上面阅读:

    当然,最相关的部分是@Valid注解的使用。 当 Spring Boot 发现一个带有 @Valid 注释的参数时,它 自动引导默认的 JSR 380 实现—— Hibernate Validator——并验证参数。

    【讨论】:

      猜你喜欢
      • 2017-10-14
      • 2017-01-04
      • 2014-08-04
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多