我有点误会。假设我有这样一个实体:
@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,但这可能并不能保证完全的数据保护。换句话说,理论上,某些程序员可能决定直接对实体执行某些操作,但未经过验证。所有这些都会导致错误。或者可能会出现这样一种情况,在数据库中的表中设置了限制,而在实体中没有限制。也就是说,你可以为实体赋任意值,但是在添加到数据库中时会出错。帮我处理一下情况。如果我没有很好地解释它,我很抱歉。
你说
实体是否应该完全对应于数据库中的表?那 例如,如果我在表中有一个
约束 字段,我是否也应该在这个字段上加上NOT NULL
注释 实体?@NotNull
Bean Validation 的目的是用于验证 beans。因此,对于您不验证实体的情况,放置未使用的注释显然没有意义。
你说
我正在验证 DTO,但这可能不能保证完成。 数据保护
JPA
注释用于此目的。比如你说的NOT NULL
场景,可以用@Column
为:
@Column(nullable = false)
您可以使用 SmartConstraints(我是作者)来验证实体和 DTO。
在对您的实体进行注释后(例如,在
@NotNull
属性上使用 description
,这对 JPA 很有用),您可以在 DTO 中的 @ValidDescription
属性上使用 description
。
使用 SmartConstraints,您可以避免实体和 DTO 之间约束不同步的风险。
有时,在多个操作中,您必须使用多个 DTO 来携带旨在更新您的实体的数据。您可以在适当的字段中重复使用
@ValidXXX
。