@Data注解中有默認toString方法的重寫。
並且Lombok的toString方法在展示數據時默認調用的是Getr方法,如果有邏輯需要在Get取值時進行計算,並且此值在創建對象以后為null值就會出現問題。
如果單獨使用@ToString注解則可以規避這個坑。同時使用Data和ToString注解時ToString的權重更高。
@ToString
可選元素
修飾符和類型 | 可選元素 | 描述 |
---|---|---|
boolean |
callSuper |
toString 在輸出中包含超類實現的結果。 |
boolean |
doNotUseGetters |
通常情況下,如果 getters 是可用的,那么被調用。 |
java.lang.String[] |
exclude |
這里列出的任何字段將不會被打印在生成的toString 實現中。 |
boolean |
includeFieldNames |
在打印時包括每個字段的名稱。 |
java.lang.String[] |
of |
如果存在,明確列出要打印的字段。 |
舉個例子
@ToString(doNotUseGetters=false) @AllArgsConstructor
@NoArgsConstructor
public class LombokBean {
private String name;
private Integer age;
public Integer getAge() { test001(); return age; }
private void test001(){ System.out.println("測試"); System.out.println(age > 0); } }
//測試lombok
@Test public void test7(){ LombokBean lombokBean = new LombokBean();
System.out.println(lombokBean); }
原因就是默認Integer為null,使用了null進行了邏輯計算。
而這一個問題的產生反而是toString在展示數據時使用的Get取值。
@ToString(doNotUseGetters=false) 是默認調用Get取值的意思。
改成true則可以避免此問題出現,會直接取實體中屬性的值。