【问题标题】:How to fix validation constraints in embedded object beeing ignored?如何修复被忽略的嵌入式对象中的验证约束?
【发布时间】:2019-01-09 08:10:14
【问题描述】:

我在 Spring Boot 和 Hibernate REST API 中有我的实体对象。这个类有很多领域。其中一部分是嵌入的,并且 @Min @Max 等验证约束不适用于 @Embeddable 类中的字段。相同的验证规则在 @Entity 类中完美运行。我正在使用 javax.validation.constraints.Max

我的主要对象如下所示:

@Entity
public class Notice extends BaseEntity {

  @Embedded
  private MyEmbeddedClass myEmbeddedClass;

  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "entity_class_id")
  private MyEntityClass myEntityClass;

}   

还有我的@embedded 类:

@Embeddable
public class MyEmbeddedClass {

  @Size(max = 50)
  private String label;

  @Max(100)
  private Integer percent;

}

@Max 对百分比字段的约束被忽略,但 @size 工作正常

@Entity
public class MyEntityClass extends BaseEntity {

  @Size(max = 50)
  private String name;

  @Max(6000)
  private Integer size;

}

这里正在创建字段大小的@Max 约束和@size 约束

有没有办法解决这个问题?我的 Spring boot 版本是 2.1.1,我可以手动创建我的数据库脚本,但我想避免这种情况,并通过休眠获得几乎完美的脚本

【问题讨论】:

  • 不确定你使用的是哪个@Max注解,但它恰好是javax.validation.constraints.Max,那么你需要这样实现:@Max(value = 5000)
  • @XtremeBaumer 是的,它来自 javax 包,但我已经尝试过这个 @Max(value = 5000) 并且仍然被忽略:/
  • 我刚刚阅读了一些关于它的文档,我认为它如下。 @Size 也是数据库列约束(varchar(50)),而 @Min 或 @Max 仅在客户端作为约束(数据库中不存在这些约束)。这意味着您需要在将实例保存到数据库等之前validate。有关此主题的更多信息,请阅读the docs
  • 感谢您的关注,但我已经找到了解决方案!问题是我必须在我的嵌入字段上使用@Valid。例如:`@Embedded @Valid private MyEmbeddedClass myEmbeddedClass`。现在正在脚本和 PostgreSQL 中创建约束。 docs

标签: java hibernate jpa bean-validation


【解决方案1】:

如果您想验证在您的@Embeddable 对象中定义的约束,您需要在您的嵌入对象上添加@Valid 注释:

@Entity
public class Notice extends BaseEntity {

    @Embedded
    @Valid
    private MyEmbeddedClass myEmbeddedClass;

    ...
}

【讨论】:

  • 我刚刚找到了一个解决方案(检查我帖子下的 cmets);)但是谢谢
猜你喜欢
  • 2014-03-08
  • 2020-06-04
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多