如果我已经验证了 DTO,我还需要验证实体吗?

问题描述 投票:0回答:2

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

@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,但这可能并不能保证完全的数据保护。换句话说,理论上,某些程序员可能决定直接对实体执行某些操作,但未经过验证。所有这些都会导致错误。或者可能会出现这样一种情况,在数据库中的表中设置了限制,而在实体中没有限制。也就是说,你可以为实体赋任意值,但是在添加到数据库中时会出错。帮我处理一下情况。如果我没有很好地解释它,我很抱歉。

java validation spring-mvc jpa bean-validation
2个回答
3
投票

你说

实体是否应该完全对应于数据库中的表?那 例如,如果我在表中有一个

NOT NULL
约束 字段,我是否也应该在这个字段上加上
@NotNull
注释 实体?

Bean Validation 的目的是用于验证 beans。因此,对于您不验证实体的情况,放置未使用的注释显然没有意义。


你说

我正在验证 DTO,但这可能不能保证完成。 数据保护

JPA
注释用于此目的。比如你说的
NOT NULL
场景,可以用
@Column
为:

@Column(nullable = false)

0
投票

您可以使用 SmartConstraints(我是作者)来验证实体和 DTO。

在对您的实体进行注释后(例如,在

@NotNull
属性上使用
description
,这对 JPA 很有用),您可以在 DTO 中的
@ValidDescription
属性上使用
description

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

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

@ValidXXX

© www.soinside.com 2019 - 2024. All rights reserved.