2017-12-17 23 views
0

で空のリストをデフォルトにヌルフィールドをデシリアライズ& list-twoが存在する場合、結果のPOJOはデフォルト値である空のリストとしてlist3list4のプロパティを持つことが予想されますが、代わりにnullとしてデシリアライズされます。Javaのジャクソンは、私は私のJSONはそうのようなジャクソンを介しするデシリアライズロンボク注釈付きPOJOを持っているPOJO

すべてのプロパティに、デシリアライズされたJSONの対応する値が含まれることを保証するために欠けているもの、またはデフォルトの割り当て値である空のリストがありますか?

---アップデート---- 私は1.4.2に春の1.3.5からアップグレードするまで、これは問題ではありませんでした、また、2.6.6から2.8.4への私のジャクソンのバージョンをアップグレードし

+0

んLists.newArrayListは、配列リストの新しいインスタンスを作成し、より多くの情報例えばhere

見つけることができますか? –

+0

修正。 'Lists.newArrayList()'は、グーグルグアバライブラリのメソッドです。私もロンボクで 'NoArgsConstructor'を削除しようとしました。すべてのフィールドを空のリストに初期化してもまだ動作しません。 –

+0

クラスパスにguavaジャクソンバインディングモジュールがありますか? –

答えて

0

問題は、@Builderも追加していることです。コードを2度実行したくないので、イニシャライザはビルダーに移動されます。

ロンボクの最近のバージョン(1.16.16+)には、そのビヘイビアに影響を与えるために使用できる@ Builder.Defaultがあります。

代わりにビルダーを使用し、オブジェクトを不変にするようにJacksonに指示できます。 Builderは不変オブジェクト用です。

開示:私はロンボクの開発者です。

+0

https://reinhard.codes/2016/07/13/using-lomboks-builderで説明したように、明示的なBuilderを定義した '@ Builder.Default'を追加しようとしました。 -notation-with-default-values /を使用し、 '@ Builder'を完全に削除しても問題は解決しません。 –

0

ロンボクの@Builderは、直接的な問題ではありません。なぜなら、ジャクソンはそれを逆シリアル化に使用しないからです。しかし、Jacksonはオブジェクトのインスタンス化のために利用可能であれば、デフォルト以外のコンストラクタをargsとともに使用しています。それ以外の場合は、非argコンストラクタを使用しています。

public ResponsePOJO(List<Object> list1, List<Object> list2, List<Object> list3, List<Object> list4) { 
    this.list1 = list1; 
    this.list2 = list2; 
    this.list3 = list3; 
    this.list4 = list4; 
} 

そして、このコンストラクタが呼び出されたときに、あなたのデフォルト値は破棄され、nullをJSONで存在しないフィールドに割り当てられている:あなたはResponsePOJO@AllArgsConstructorを使用すると、ジャクソンはこのようになります作成したコンストラクタをとります。

@Builderは、すべての引数のコンストラクタが必要ですが、あなたはこの問題を解決するには、いくつかの方法があります:

  1. @Builderを使用して@AllArgsConstructorを削除しない - 時にはあなたはこれらのいずれかを必要としないかもしれないが、それはあなたのケース
  2. に依存し
  3. @AllArgsConstructorを削除して、すべての引数コンストラクタを内部ではなく、引数なしのカスタムビルダーを作成します。
  4. 使用@Builderとすべての引数は、これと同じコンストラクタカスタム作成:

    public ResponsePOJO(List<Object> list1, List<Object> list2, List<Object> list3, List<Object> list4) { 
        this.list1 = list1 == null ? Lists.newArrayList() : list1; 
        this.list2 = list2 == null ? Lists.newArrayList() : list2; 
        this.list3 = list3 == null ? Lists.newArrayList() : list3; 
        this.list4 = list4 == null ? Lists.newArrayList() : list4; 
    } 
    

    ここでジャクソンはまだ上記のすべての引数のコンストラクタを呼び出しますが、いくつかのフィールドが存在しないか、存在し、nullでいない場合(これは持っていること場合によってはヌル値(nullityに対する検証など)が期待できる場合は、ビジネスロジックへのダウンストリームの影響がありますが、常に空のリストが割り当てられます。

0

ジャクソン(com.fasterxml)を使用してJSONオブジェクトをデシリアライズする同様の問題が発生しました。jackson)とLombokの@Builderアノテーションです。クラス内に@JsonPOJOBuilderというアノテーションが付けられた空のBuilderクラスを作成し、空のクラスへの参照を@JsonDeserializeに追加することで、この問題を解決できました。あなたは

@Getter 
@ToString 
@NoArgsConstructor 
@Builder 
@AllArgsConstructor 
@EqualsAndHashCode 
@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonDeserialize(builder = ResponsePOJO.TypeBuilder.class) 
public class ResponsePOJO { 
    @JsonPOJOBuilder(withPrefix = "") 
    @JsonIgnoreProperties(ModelUtils.TYPE_INFO_PROPERTY) 

    public static class TypeBuilder{}//Empty builder class 
            //Needed just to apply annotations 
            //Lombok will fill it in later. 

    @JsonProperty("list-one") 
    private List<Object> list1 = Lists.newArrayList; 
    @JsonProperty("list-two") 
    private List<Object> list2 = Lists.newArrayList; 
    @JsonProperty("list-three") 
    private List<Object> list3 = Lists.newArrayList; 
    @JsonProperty("list-four") 
    private List<Object> list4 = Lists.newArrayList; 
} 
関連する問題