我对使用数据注释到DTO类感到困惑。这是我的示例类。
@Data
public class MyClass {
private Long id;
private String name;
}
我在网上读到,特别是在DTO类上使用数据注释将允许通过使用生成的设置器来更改字段的值。
我应该删除lombok Data注释吗?并手动实现getter和setter。
谢谢:)
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"}
注释@Data
来自Lombok项目,该项目主要通过注释使用反射。该注释确保生成所有setter、getter、具有所有必需参数的构造函数,并覆盖Object::toString
、Object::equals
和Object::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
注释并手动编写您的注释。
我会避免使用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 给予而不是我期望的 给予。 哪里来的? 问题答案: 我不确定您使用的是哪个版本,但是听起来像此链接描述了您正在体验的版本。 从链接: 浮点数被存储为近似值;如果要存储价格,最好使用存储精确值的十进制数据类型。