在将数据批注用于DTO类时,我感到困惑。这是我的示例课。
@Data
public class MyClass {
private Long id;
private String name;
}
我已经在线阅读了专门用于DTO类的数据注释,这将允许使用生成的设置器来更改字段的值。
我应该删除lombok数据注释吗?并手动实现getter和setter。
谢谢:)
答案 0 :(得分:1)
注释@Data
来自Lombok项目,该项目旨在通过注释使用反射。此注释可确保生成所有的setter,getter,具有所有必需参数并覆盖了Object::toString
,Object::equals
和Object::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。