在Java DTO类上使用Data注解

llew8vvj  于 2023-06-04  发布在  Java
关注(0)|答案(5)|浏览(711)

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

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

我在网上读到,专门在DTO类上使用Data注解将允许通过使用生成的setter来更改字段的值。
我应该删除lombok数据注解吗?并手动实现getter和setter。
Thanks:)

3npbholx

3npbholx1#

我会避免使用DTO的@Data,因为它有太多的陷阱。首先,正如你提到的,它是可变的,你并不真的想要一个DTO。尽管它是可变的,但它实现了equals()和hashCode(),这只会带来麻烦。
您可以使用@Value作为不可变的DTO。对于传入的DTO,您可能需要将lombok.anyConstructor.addConstructorProperties添加到lombok.config,这将允许像Jackson这样的库在没有默认构造函数的情况下反序列化到POJO。

6bc51xsx

6bc51xsx2#

注解@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注解并手动编写注解。

kupeojn6

kupeojn63#

默认情况下,@Datalombok注解将为类中的所有字段生成setter和getter。
如果您想要一个不可变的数据传输对象,请将其注解为@Value
如果你想在MyClass类型中混合一些不可变值和一些可变值,例如你可能希望id字段是不可变的,而其余的是可变的,你可以在你想成为不可变的字段上使用@Setter注解,指定NONEAccessLevel。例如:

@Data
public class MyClass {
   @Setter(AccessLevel.NONE)
   private Long id;
   private String name;
}

这将为id生成一个getter但不生成setter,为name生成一个getter和setter。

rur96b6h

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"}
zed5wv10

zed5wv105#

Java 14开始,您可以为DTO使用record

public record MyClass(Long id, String name) {}

相关问题