Wie deaktiviere ich fail_on_empty_beans in Jackson?

98

Wie deaktiviere ich mit Jackson 2.1 die Deaktivierung, die fail_on_empty beansdie Fehlermeldung zu deaktivieren scheint?

Ich gehe davon aus, dass dies nur die einfachste Sache der Welt ist, aber zum Teufel ist es spät und ich konnte kein einfaches Tutorial oder etwas besonders offensichtliches aus dem finden api. SerializationFactory? Warum sollten sie es so unintuitiv machen und dann die Fehlermeldung so einfach erscheinen lassen?

Obwohl ich tun wie die Fehlermeldung, meine ich, ist es besser als ein NPE.

Ich gehe davon aus, dass es eine Möglichkeit gibt, dies mithilfe von Anmerkungen zu tun - aber ich möchte sie überhaupt nicht für die vereinfachende Arbeit verwenden, die ich mache!

Bharal
quelle

Antworten:

123

Sie können dies pro Klasse oder global tun, glaube ich.

Versuchen Sie für jede Klasse @JsonSerialize über der Klassendeklaration.

Für einen Mapper ist hier ein Beispiel:

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)

Der unten stehende Link StackOverflow enthält auch ein Beispiel für ein Spring-Projekt.

Für REST mit Jersey erinnere ich mich nicht von oben, aber ich glaube, es ist ähnlich.


Einige Links, die ich ausgegraben habe: (bearbeiteter 1. Link aufgrund des Herunterfahrens von Codehaus).

Pancakeo
quelle
Ich habe dieses heute früher verwendet, habe einige weitere Informationen, z. B. automatische Erkennung. stackoverflow.com/questions/4362104/…
Pancakeo
1
Können Sie ein Beispiel geben, wie Sie die Klassendeklaration @JsonSerializedeaktivieren können FAIL_ON_EMPTY_BEANS?
Tuk
2
Seit ein paar Jahren :). Dies könnte helfen: stackoverflow.com/questions/12162413/…
Pancakeo
Oder Sie können die Deaktivierungsmethode der ObjectMapper-Klasse wie "mapper.disable (SerializationFeature.FAIL_ON_EMPTY_BEANS)"
Reddeiah Pidugu
43

Wenn Sie Spring Boot verwenden, können Sie die folgende Eigenschaft in der Datei application.properties festlegen. spring.jackson.serialization.FAIL_ON_EMPTY_BEANS = false

Abhishek Jain
quelle
22

Sie können das gleiche Problem auch erhalten, wenn Ihre Klasse keine öffentlichen Methoden / Eigenschaften enthält. Normalerweise habe ich dedizierte DTOs für API-Anfragen und -Antworten, die als öffentlich deklariert wurden, aber in einem Fall vergessen, die Methoden ebenfalls öffentlich zu machen - was in erster Linie die "leere" Bean verursachte.

RJStanford
quelle
13

Sie können die Klasse wahrscheinlich auch mit Anmerkungen versehen @JsonIgnoreProperties(ignoreUnknown=true), um die in der Klasse nicht definierten Felder zu ignorieren

AllDayAmazing
quelle
1
Dies wird nicht funktionieren, wenn die ganze Bohne tatsächlich null ist
Maryoush
12

Wenn Sie ein JSON-Objekt ohne zusätzliche Felder erhalten möchten, fügen Sie diese Anmerkung Ihrer Klasse hinzu. Sie hat perfekt für mich funktioniert.

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

Sie können diese Zeile auch in Ihre application.properties-Datei einfügen, sie fügt Ihrem JSON jedoch ein zusätzliches Feld hinzu.

spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
user1913615
quelle
Ich habe versucht, JSON aus einem meiner Controller in meiner Spring-Boot-REST-App zurückzugeben, und dies hat es für mich behoben.
Ninjasense
Der perfekte Weg, wenn Sie ein leeres Objekt haben!
Georgi Peev
3

Wenn Sie org.codehaus.jackson.map.ObjectMapper verwenden, dann pls. Verwenden Sie die folgenden Zeilen

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Thangamanikasi
quelle
2

Verwenden Sie in Jersey Rest Services einfach die JacksonFeatures-Anmerkung ...

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

In meinem Fall habe ich es versäumt, eine @ JsonProperty-Annotation in eines der Felder zu schreiben, die diesen Fehler verursacht haben.

Wahib Ul Haq
quelle
1

Fügen Sie hier eine Lösung für ein anderes Problem hinzu, das sich jedoch mit demselben Fehler manifestiert. Achten Sie beim Erstellen von json im laufenden Betrieb (als API-Antworten oder was auch immer) darauf, wörtliche doppelte Anführungszeichen in Ihren Zeichenfolgenelementen zu vermeiden. Möglicherweise verbrauchen Sie Ihren eigenen missgebildeten Json.

Kirk B.
quelle
1

Um dieses Problem zu beheben, konfigurieren Sie Ihre JsonDataFormat-Klasse wie folgt

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

das ist fast gleichbedeutend mit,

mapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Reddeiah Pidugu
quelle
0
ObjectMapper mapper = new ObjectMapper();

Hallo,

Wenn ich benutze mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)

Meine JSON-Objektwerte sind im eckigen Seitenmittel als Antwort leer

Gelöst mit Hilfe nur der folgenden Einstellungen

mapper.setVisibility(mapper.getSerializationConfig().getDefaultVisibilityChecker().
withFieldVisibility(JsonAutoDetect.Visibility.ANY).withGetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
                .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));
Shahid Hussain Abbasi
quelle
0

In meinem Fall musste ich es nicht deaktivieren, sondern musste diesen Code über meine Klasse setzen: (und dies löste mein Problem)

    @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.
}
AppEmmanuel
quelle