2017-06-08 1 views
1

I持って、次の(簡体字)クラス:ロンボクビルダー

@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" 
    // ... 

} 

これは一般的なケースでは正常に動作しますが、問題は、このエンティティは、春(特に春データによって構築されます時期についてきますそれを作成するためのREST要求に応答するリポジトリ)。 Springはall-argsコンストラクタを見て、それを使用してfooのヌル値を設定します(この場合、POSTデータに設定されていません)、fooのNULL値は、"Some Default Value"の代わりになります。 @Builder.Default

単純にセッターを作成してヌルを防ぐのは機能しません。私はAllArgsConstructorを明示的に書き出すことができましたが、それはある程度ロンボクの目的を打ち負かしています。恐ろしい解決策ではなく、理想的ではありません。

誰もがこのための任意の回避策を考えることができますか?

+0

アクセスタイプを変更してみましたか。クラス – pvpkiran

+0

でこの '@AccessType(AccessTpe.FIELD)'を試してください。どうすればそれが動作するのかわかりません。 AccessTypeは、永続化される値をデータレイヤが取得する方法です。直接フィールドを介して、またはアクセサを介して。また、デフォルトではすでにフィールドにアクセスしているので、これは変更されていないと思います。 –

答えて

0

私はあなたが非ロンボクのデフォルト値でデフォルト値を指定できることを知っています。私はこの特殊なケースで試したことはありませんが、その価値はあります。

@value( "#{[ 'my.property']を支える:?12345}")

たぶん、あなたは唯一の非/最後のあたりの」一つの引数を使用してコンストラクタを指定RequiredArgsコンストラクタを使用してみてください-null field "であり、varをオーバーライドしません。

https://projectlombok.org/features/constructor

+0

Builderの注釈には関係なく、AllArgsConstructorが必要です。そして、Springは、他のバージョンよりもすべて引数のあるバージョンを選ぶことに熱心であるようです。 値の注釈はどれですか?ロンボクのものは、物件には適用できません。私は、春のものはここで何か良いとは思いません。これは、設計時には知られていないものにデフォルト値を設定しますが、all-argsコンストラクタの動作をオーバーライドすることはありません。 –

0

私は私のモデルクラスでPrePersistのアノテーションを使用してこの問題を回避することができました。 PrePersistを使用すると、null値がいつnullに設定されたか、または誰によって設定されたかにかかわらず、ヌル値がデフォルト値に設定されるようにすることができます。本当にこれのための修正ではありませんが、私はおそらく何とかやっていなければならないことがありますので、それは容認できる回避策です。