如果我已经验证了 DTO,是否需要验证实体?



我有一点误会。假设我有这样一个实体:

@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 中使用@ValidDescriptiondescription属性。

使用 SmartConstraint,您可以避免实体和 DTO 之间约束不同步的风险。

有时,在多个操作中,您必须使用多个 DTO 来携带旨在更新实体的数据。您可以对适当的字段重用@ValidXXX

最新更新