我对DTO类使用数据注解感到困惑。这是我的示例类。
@Data public class MyClass { private Long id; private String name; }
我在网上读到,专门在DTO类上使用Data注解将允许通过使用生成的setter来更改字段的值。我应该删除lombok数据注解吗?并手动实现getter和setter。Thanks:)
3npbholx1#
我会避免使用DTO的@Data,因为它有太多的陷阱。首先,正如你提到的,它是可变的,你并不真的想要一个DTO。尽管它是可变的,但它实现了equals()和hashCode(),这只会带来麻烦。您可以使用@Value作为不可变的DTO。对于传入的DTO,您可能需要将lombok.anyConstructor.addConstructorProperties添加到lombok.config,这将允许像Jackson这样的库在没有默认构造函数的情况下反序列化到POJO。
lombok.anyConstructor.addConstructorProperties
6bc51xsx2#
注解@Data来自Lombok项目,该项目旨在主要通过注解使用反射。这个注解确保生成所有的setter、getter、带有所有必需参数的构造函数以及覆盖的Object::toString、Object::equals和Object::hashCode方法。简而言之,这个注解“完成”了一个简单的POJO对象,并生成了所有的样板文件,而不需要使用IDE。他们将注解命名为@Data,因为它们支持将对象仅理解为数据容器的想法。据我所知,生成只发生在缺少getter/setter的情况下(为了简洁起见,让我们来谈谈它们)。生成的getter/setter是纯形式的,如你所知:
@Data
Object::toString
Object::equals
Object::hashCode
public int getId() { return this.id; } public void setId(int id) { this.id = id; }
您可以使用更详细的setter/getter来执行验证或任何类似的操作,以覆盖生成的验证。您可以使用@Data注解并手动编写注解。
kupeojn63#
默认情况下,@Datalombok注解将为类中的所有字段生成setter和getter。如果您想要一个不可变的数据传输对象,请将其注解为@Value。如果你想在MyClass类型中混合一些不可变值和一些可变值,例如你可能希望id字段是不可变的,而其余的是可变的,你可以在你想成为不可变的字段上使用@Setter注解,指定NONE的AccessLevel。例如:
@Value
MyClass
@Setter
NONE
AccessLevel
@Data public class MyClass { @Setter(AccessLevel.NONE) private Long id; private String name; }
这将为id生成一个getter但不生成setter,为name生成一个getter和setter。
rur96b6h4#
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"}
zed5wv105#
从Java 14开始,您可以为DTO使用record:
record
public record MyClass(Long id, String name) {}
5条答案
按热度按时间3npbholx1#
我会避免使用DTO的@Data,因为它有太多的陷阱。首先,正如你提到的,它是可变的,你并不真的想要一个DTO。尽管它是可变的,但它实现了equals()和hashCode(),这只会带来麻烦。
您可以使用@Value作为不可变的DTO。对于传入的DTO,您可能需要将
lombok.anyConstructor.addConstructorProperties
添加到lombok.config,这将允许像Jackson这样的库在没有默认构造函数的情况下反序列化到POJO。6bc51xsx2#
注解
@Data
来自Lombok项目,该项目旨在主要通过注解使用反射。这个注解确保生成所有的setter、getter、带有所有必需参数的构造函数以及覆盖的Object::toString
、Object::equals
和Object::hashCode
方法。简而言之,这个注解“完成”了一个简单的POJO对象,并生成了所有的样板文件,而不需要使用IDE。
他们将注解命名为
@Data
,因为它们支持将对象仅理解为数据容器的想法。据我所知,生成只发生在缺少getter/setter的情况下(为了简洁起见,让我们来谈谈它们)。生成的getter/setter是纯形式的,如你所知:
您可以使用更详细的setter/getter来执行验证或任何类似的操作,以覆盖生成的验证。您可以使用
@Data
注解并手动编写注解。kupeojn63#
默认情况下,
@Data
lombok注解将为类中的所有字段生成setter和getter。如果您想要一个不可变的数据传输对象,请将其注解为
@Value
。如果你想在
MyClass
类型中混合一些不可变值和一些可变值,例如你可能希望id字段是不可变的,而其余的是可变的,你可以在你想成为不可变的字段上使用@Setter
注解,指定NONE
的AccessLevel
。例如:这将为id生成一个getter但不生成setter,为name生成一个getter和setter。
rur96b6h4#
DTO是用来传输数据信息的,有些信息其实是我们不希望用户能够更改或者访问的,比如用户密码,我们不希望传递到前端的时候用户能够看到加密的密码,或者我们不希望用户在修改密码的同时更改自己的信息,而在这个序列化过程中起作用的是setter和getter,以及自动为所有字段生成getter和setter的数据注解。
比如说,
这个类,将有所有的setter和getter。当你转网的时候,你会看到
这太可怕了但如果使用DTO
他们只看到
zed5wv105#
从Java 14开始,您可以为DTO使用
record
: