ジャクソンでfail_on_empty_beansを無効にするにはどうすればよいですか?


99

ジャクソン2.1を使用しfail_on_empty beansて、エラーメッセージで無効にしたいように見えるのを無効にするにはどうすればよいですか?

これは世界で最も単純なものだと思いますが、それは遅すぎて、簡単なチュートリアルや特にから明らかなものを見つけることができませんでしたapiSerializationFactory?なぜ彼らはそれをそれほど直感的にせず、エラーメッセージをとても簡単に見えるようにするのでしょうか?

私はがやるのエラーメッセージのように、私が意味する、それはNPEよりも優れています。

私は注釈を使用してこれを行う方法があると想定しています-しかし、私がやっている単純化された作業のためにそれらを使用することにまったく熱心ではありません!

回答:


124

これはクラスごとに、またはグローバルに行うことができると思います。

クラスごとに、クラス宣言の上の@JsonSerializeを試してください。

マッパーの場合の例を次に示します。

ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
// do various things, perhaps:
String someJsonString = mapper.writeValueAsString(someClassInstance);
SomeClass someClassInstance = mapper.readValue(someJsonString, SomeClass.class)

以下のStackOverflowリンクにも、Springプロジェクトの例があります。

ジャージーを使用したRESTの場合、頭から離れたところは覚えていませんが、同じようなものだと思います。


私が掘り起こしたいくつかのリンク:(Codehausがシャットダウンしたため編集された最初のリンク)。


今日私はこれを以前に使用しましたが、自動検出など、いくつかの情報があります。stackoverflow.com/questions/4362104/...
Pancakeo

1
クラス宣言@JsonSerializeを無効にする方法の例を挙げられますFAIL_ON_EMPTY_BEANSか?
トゥクトゥク

2
数年来ました:) このかもしれないのヘルプ:stackoverflow.com/questions/12162413/...
Pancakeo

または、「mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)」のようなObjectMapperクラスのdisableメソッドを使用できます
Reddeiah Pidugu

43

Spring Bootを使用している場合は、application.propertiesファイルで次のプロパティを設定できます。spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false


22

クラスにパブリックメソッド/プロパティが含まれていない場合にも、同じ問題が発生する可能性があります。私は通常、API要求と応答専用のDTOを公開して宣言していますが、ある場合にはメソッドも公開するのを忘れていました。これにより、そもそも「空」のBeanが発生しました。


13

また、クラスに@JsonIgnoreProperties(ignoreUnknown=true)未定義のフィールドを無視するようにクラスに注釈を付けることもできます


1
Bean全体が実際にnullである場合、これは機能しません
maryoush

12

追加のフィールドなしでJSONオブジェクトを取得したい場合は、このアノテーションをクラスに追加してください。

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

この行をapplication.propertiesファイルに追加することもできますが、JSONにフィールドが追加されます。

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false

スプリングブートRESTアプリでコントローラーの1つからJSONを返そうとしていましたが、これで修正されました。
ninjasense

空のオブジェクトがある場合の完璧な方法!
Georgi Peev

3

org.codehaus.jackson.map.ObjectMapperを使用する場合は、pls。次の行を使用します

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

2

Jersey Rest Servicesでは、JacksonFeaturesアノテーションを使用するだけで...

@JacksonFeatures(serializationDisable = {SerializationFeature.FAIL_ON_EMPTY_BEANS})
public Response getSomething() {
    Object entity = doSomething();
    return Response.ok(entity).build();
}

1

私の場合、このエラーの原因となっているフィールドの1つに@JsonPropertyアノテーションを書き忘れていました。


1

別の問題に対する解決策をここに追加しますが、同じエラーで明らかになるもの...文字列メンバー内のリテラル二重引用符をエスケープするために(API応答などとして)jsonをオンザフライで構築するときは注意してください。あなたはあなた自身の不正なjsonを消費しているかもしれません。


1

この問題を修正するには、JsonDataFormatクラスを以下のように構成します

ObjectMapper mapper = new ObjectMapper();
mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

これはほぼ同等です

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);

0
ObjectMapper mapper = new ObjectMapper();

こんにちは、

私が使うとき mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

私のjsonオブジェクトの値は ''応答で角度ページ平均で空白になります

以下の設定のみの助けを借りて解決

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

0

私の場合、それを無効にする必要はありませんでした。このコードをクラスの一番上に置く必要がありました(これで問題が解決しました)。

    @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)//this is what was added
    @Value //this was there already
    @Builder//this was there already

public class NameOfClass {
     //some code in here.
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.