Springboot中vo类的常用注解@Accessors/@Data/@JsonInclude(JsonInclude.Include.NON_NULL)

一、@Accessors(chain = true)

包含的属性

fluent(布尔型)chain(布尔型)prefix(String型)

作用域:

既可以注解在类上也可以注解在属性上

作用在VO实体类加注解@Accessors(chain = true)之后,在service层写业务逻辑实例化vo对象的相关赋值动作就可通过链式写法来编程,简洁高效。如下例子:

 VO实例:

@Data
@Accessors(chain = true)
public class User {
    private int id;
    private String name;
    private String sex;
}

 Service层调用:


//实例化对象后,通过链式写法设置多个属性值
Person user=new User();
user.setId(1).setName("user").setSex("m");

 解析原理:

        ​​​​​​

// 注解生成的setter方法如下,方法体略

  1. public User setId(int id) {}

  2. public User setName(String name) {}

  3. public User setSex(String sex) {}

        我们在进行属性赋值的时候,因为set方法返回的是当前的对象,所以可以进行连续调用set方法进行赋值,如上述代码所示。没加注解的情况下一般我们是使用@Data,默认生成对应的set方法的返回值是void;由于set方法返回值是void类型,所以需分开赋值user.setId(1);user.setName("user");user.setSex("um");从代码简洁可读性看,明显是链式写法更优。
 

二、@JsonInclude(JsonInclude.Include.NON_NULL)

是为实体类在接口序列化返回值时增加规则的注解

在springboot项目中,前端发送请求后得到的响应体,我们都会先设计一个对应的实体类,将其转换为json数据,最终返回改响应体。该注解用在对应的vo实体类,如果某一属性为空,在前端请求后返回的json数据中,字段值为null的字段则不显示。即一个接口需要过滤掉返回值为null的字段,即值为null的字段不返回,可以在实体类中增加该注解。

另外还有一个属性是ALWAYS, ALWAYS为默认值,表示全部序列化,即默认返回全部字段,例:

@JsonInclude(JsonInclude.Include.ALWAYS)

 三、@Data

简化了我们VO实体类中的代码,加上注解后无需再生成属性对应的get,set方法,构造器等

  • 省去get,set这种冗余的方法
  • 其中包含了@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor等

其中特别说明一下 

我们的vo实体类使用@Data注解时,@Data默认包含的是:@EqualsAndHashCode(callSuper = false),如果我们的实体类有继承父类的情况下,这个就需要根据实际情况来赋值了。

true&false两者区别:假设当前实体类A实例化了两个对象,实体类A继承父类B,

@EqualsAndHashCode(callSuper = false):当我们在对两个对象属性比较的时候,如果两个对象属性一致,父类属性不一致,在比较时候仍是出现相同的结果,也就是返回的true。

@EqualsAndHashCode(callSuper = true):如果加了这个注解,则相反,进行对象属性比较时,子类和父类一同进行比较,也就是:如果两个对象子类属性一致,父类不一致,返回的是false;只有子类和继承类的属性都一致时,才会返回true
 


版权声明:本文为studyday1原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。