当前位置: 首页 > 知识库问答 >
问题:

在 Java DTO 类上使用数据注释

张承颜
2023-03-14

我对使用数据注释到DTO类感到困惑。这是我的示例类。

@Data
public class MyClass {
   private Long id;
   private String name;
}

我在网上读到,特别是在DTO类上使用数据注释将允许通过使用生成的设置器来更改字段的值。

我应该删除lombok Data注释吗?并手动实现getter和setter。

谢谢:)

共有3个答案

宗政权
2023-03-14

DTO是用来传输数据信息,有些信息其实就是我们不希望用户能够更改或访问,比如用户密码,我们不想在用户看到加密密码的时候传递给前端,或者我们不希望用户在修改密码的同时改变自己的信息, 在此序列化过程中起作用的是 setter 和 getter,以及为所有字段自动生成 getter 和 setter 的数据注释。

比如说

@Data
class User{

private String userName;

private String pwd;
}

这个类将拥有所有的setter和getter。当你转到网上,你会看到

{userName: "123", pwd: "xxx"}

这太可怕了。但是如果你用DTO

class User{

private String userName;

private String pwd;

public String getUserName(){
    return userName;
}
}

他们只看到

{userName: "123"}
胡志
2023-03-14

注释@Data来自Lombok项目,该项目主要通过注释使用反射。该注释确保生成所有setter、getter、具有所有必需参数的构造函数,并覆盖Object::toStringObject::equalsObject::hashCode方法。

简而言之,这个注释“完成”了一个简单的POJO对象,并生成了所有样板文件,而无需使用IDE。

他们将注释命名为@Data,因为它们支持仅将理解对象作为数据容器的想法。

据我所知,生成只针对缺少的getter/setter(为了简洁起见,让我们谈谈它们)。如您所知,生成的getter/setter是纯格式的:

public int getId() { return this.id; }

public void setId(int id) { this.id = id; }

您可以使用更详细的setter/getter执行验证或任何类似的东西来覆盖生成的验证。您可以使用@Data注释并手动编写您的注释。

韶弘壮
2023-03-14

我会避免使用DTO的@Data,因为它有太多陷阱。首先,正如您所提到的,它是可变的,而您并不真正需要DTO。尽管它是可变的,但它实现了equals()和hashCode(),这只会带来麻烦。

您可以将@Value用于不可变DTO。对于传入的DTO,您可能需要将lombok.anyConstructor.addConstructorProperties添加到您的lombok.config,这将允许jackson等库在没有默认构造函数的情况下反序列化到您的POJO。

 类似资料:
  • 我读过关于Kotlin数据类的书,认为它们在描述数据传输对象(DTO)的情况下非常有用。在我的Java项目中,我已经有了用Java编写的DTO类,比如: 这些DTO类存储在单独的工件中,我将其作为依赖项添加到其他工件中。所以,我决定用Kotlin类替换它,并在Kotlin上重写了提到的Tweet类,所以它开始看起来像: 这是我第一次使用静态编程语言,所以可能有些东西看起来很难看,但我的主要问题是—

  • 我知道如何在普通Kotlin类上使用apply函数,但无法将其用于数据类: 我得到一个编译消息: 没有为参数“name”传递值

  • 问题内容: 我的项目中有注释驱动的hibernate功能。 现在,我想在列上创建索引。我当前的列定义是 我在这里添加注释 然后删除表并重新启动Tomcat服务器。实例化服务器后,创建了表,但是在以下查询中看不到新索引。 预期用新索引构造表。我在MySQL中使用InnoDB。 问题答案: 有趣的是,在Hibernate配置中,我正在使用。 这修改了一个现有的数据库。我是手动删除该表并重新启动Tomc

  • 我使用FireStore的基于Java的注释来标记字段,并使用将文档字段映射到Java类元素的方法: 我在Kotlin数据类的一个字段上使用它,它编译得很好: null 注释现在显示在Java类对象的生成getter中。这至少在实践中是可行的,但我很好奇为什么Kotlin让我将注释编译为针对字段的注释,但不允许我在运行时将其返回(除非我在kotlin-reflect API中遗漏了什么?)。 如果

  • 我有以下课程: 为什么我无法在抽象类(< code>Parent)的实例上调用< code>toBuilder(),如下面的代码所示?

  • 问题内容: 一张桌子: 物品(编号,价格) 有一行: id:1,价格:565.8 给予而不是我期望的 给予。 哪里来的? 问题答案: 我不确定您使用的是哪个版本,但是听起来像此链接描述了您正在体验的版本。 从链接: 浮点数被存储为近似值;如果要存储价格,最好使用存储精确值的十进制数据类型。