在Java DTO类上使用数据注释

时间:2018-08-13 10:23:20

标签: java spring spring-boot dto lombok

在将数据批注用于DTO类时,我感到困惑。这是我的示例课。

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

我已经在线阅读了专门用于DTO类的数据注释,这将允许使用生成的设置器来更改字段的值。

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

谢谢:)

4 个答案:

答案 0 :(得分:1)

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

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

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


据我了解,这一代只会发生在缺少的吸气剂/阻气剂上(为简洁起见,请说一下它们)。如您所知,生成的getter / setter都是纯格式的:

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

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

您可以使用更多详细的setter / getter来执行验证,或者使用任何类似的方法来覆盖已生成的方法。您既可以使用@Data批注,也可以手动编写批注。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

如果要使用不可变的数据传输对象,请改为将其标记为@Value

如果您想在MyClass类型中混合使用一些不变的值和一些可变的值,例如,您可能希望id字段是不变的,而其余的则是可变的,则可以使用@Setter在您要成为不可变字段的注释上,指定AccessLevel中的NONE。例如: @Data public class MyClass { @Setter(AccessLevel.NONE) private Long id; private String name; }

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

答案 3 :(得分:0)

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

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