我有一点误会。假设我有这样一个实体:
@Entity
public class Item {
private String description;
}
以及该实体的 DTO:
public class ItemDto {
private String description;
}
如您所知,所有控制器都仅适用于 DTO,也就是说,我从客户端部分获取 DTO,然后将其转换为实体,依此类推。因此,我决定验证 DTO:
public class ItemDto {
@Max(value = 100, message = "Description must not exceed 100 characters")
private String description;
}
验证效果很好,但我有一个问题:我还需要验证实体吗?我一直认为实体中的验证注释是无用的,因为您仍然自己创建必要的表并设置必要的限制。但随之而来的问题是,实体是否应该与数据库中的表相对应?也就是说,例如,如果我在某个字段的表中有一个NOT NULL
约束,我是否也应该在实体中的此字段上放置@NotNull
注释?DTO也不清楚。我正在验证 DTO,但这可能无法保证完整的数据 protection.in 换句话说,理论上,一些程序员可能会决定直接对实体做一些事情,但它没有经过验证。所有这些都会导致错误。或者可能存在在数据库中的表中设置了限制的情况,但在 entity.in 中没有限制,换句话说,您可以为实体分配任何值,但在将其添加到数据库时会发生错误。帮我处理这种情况。如果我没有很好地解释它,我很抱歉。
你说
实体是否应该与数据库中的表相对应?那 例如,如果我在表中有一个
NOT NULL
约束 字段,我是否也应该在此字段上放置@NotNull
注释 实体?
Bean 验证的目的是用于验证 Bean。因此,对于您不验证实体的情况,放置未使用的注释显然没有意义。
你说
我正在验证 DTO,但这可能无法保证完整。 数据保护
JPA
注释用于此目的。例如,在您提到的NOT NULL
方案中,可以使用@Column
:
@Column(nullable = false)
您可以使用 SmartConstraint(我是作者(来验证实体和 DTO。
在注释您的实体后(例如,在description
属性上使用@NotNull
,这对 JPA 很有用(,您可以在 DTO 中使用@ValidDescription
description
属性。
使用 SmartConstraint,您可以避免实体和 DTO 之间约束不同步的风险。
有时,在多个操作中,您必须使用多个 DTO 来携带旨在更新实体的数据。您可以对适当的字段重用@ValidXXX
。