2017-06-08 47 views
1

我有以下的(簡化)類:龍目島建造者在Spring數據缺省

@Entity 
@Data 
@Builder 
@NoArgsConstructor // @Builder creates the all-args version but I need this one elsewhere. 
@AllArgsConstructor(access = AccessLevel.PRIVATE) // Having @NoArgsConstructor disables the @AllArgsConstructor needed by @Builder unless I have this explicitly applied 
public class MyClass { 

    // ... 
    @Builder.Default 
    private String foo = "Some Default Value" 
    // ... 

} 

這正常在一般情況下,但問題來了什麼時候該實體得到由春(尤其是Spring數據建存儲庫以響應創建它的REST請求)。 Spring會看到全參數構造函數並使用它,爲foo設置一個空值(在這種情況下,它不是在POST數據中設置的),並且最終以foo爲空值而不是預期的"Some Default Value"@Builder.Default

簡單地創建setter並防止null值不起作用。我可以明確地寫出AllArgsConstructor,但這(有點)在某種程度上擊敗了Lombok的目的。不是一個可怕的解決方案,但並不理想。

任何人都可以想到這方面的任何解決方法?

+0

您是否嘗試更改AccessType。嘗試在類 – pvpkiran

+0

上使用'@AccessType(AccessTpe.FIELD)',我看不出如何工作。 AccessType是關於數據層如何獲得要被持久化的值,對吧?直接通過現場或通過訪問器。此外,默認情況下已經是字段訪問,所以這不會是一個變化,我不認爲。 –

回答

0

我知道你可以使用非lombok默認值指定默認值。我沒有嘗試過這個特例,但它值得一試。

@Value(「#{道具[‘my.property’]:12345}」)

也許你應該嘗試使用RequiredArgs構造只指定使用「每一個參數的構造最終/非-null字段「,並且不會覆蓋var。

https://projectlombok.org/features/constructor

+0

無論如何,Builder註解都需要一個AllArgsConstructor。而且Spring似乎渴望選擇任何其他版本的all-args版本。 哪個值註釋是?龍目島不能適用於一個財產,我不認爲春天在這裏會有任何好處。它會將默認值設置爲在設計時不知道的值,但不會覆蓋all-args構造函數的行爲。 –

0

我能解決這個在我的模型類使用PrePersist註解。通過PrePersist,我可以確保無論設置爲null還是由誰設置null值,都可以設置其默認值。這不是一個真正的解決方案,但是我應該可以做些什麼,所以這是一個可以接受的解決方法。