在 Java DTO 类上使用数据注释



我在使用数据注释到DTO类时感到困惑。这是我的示例课程。

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

我在网上读到,专门在 DTO 类上使用数据注释将允许通过使用生成的资源库来更改字段的值。

我应该删除龙目岛数据注释吗?并手动实现吸气剂和二传手。

谢谢:)

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

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

注释@Data来自龙目岛项目,该项目旨在主要通过注释使用反射。这个注解保证了所有 setter、getter、一个具有所有必需参数和重写的Object::toStringObject::equalsObject::hashCode方法的构造函数的生成。

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

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


据我了解,这一代只发生在失踪的getter/setters身上(为了简洁起见,让我们谈谈他们(。如您所知,生成的吸气剂/二传手是纯形式:

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

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

默认情况下,@Datalombok 注释将为类中的所有字段生成 setter 和 getter。

如果需要不可变的数据传输对象,请改为将其批注为@Value

如果您希望在MyClass类型中混合一些不可变值和一些可变值,例如,您可能希望 id 字段不可变,其余字段可变,您将在要不可变的字段上使用@Setter注释,指定AccessLevelNONE。例如:

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

这将生成一个 getter,但没有 id 的 setter,以及名称的 getter 和 setter。

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

例如

@Data
class User{
private String userName;
private String pwd;
}

这个班级,将有所有的二传手和getter。当您跨转到网络时,您会看到

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

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

class User{
private String userName;
private String pwd;
public String getUserName(){
return userName;
}
}

他们只看到

{userName: "123"}

Java 14开始,你可以对你的 DTO 使用record

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

最新更新