Ich bekomme die Ausnahme, wenn ich versuche, ein sehr einfaches Objekt mit Jackson zu serialisieren. Der Fehler:
org.codehaus.jackson.map.JsonMappingException: Für die Klasse MyPackage.TestA wurde kein Serializer gefunden und es wurden keine Eigenschaften zum Erstellen von BeanSerializer gefunden (um Ausnahmen zu vermeiden, deaktivieren Sie SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS).
Unten finden Sie die einfache Klasse und den Code zum Serialisieren.
Kann mir jemand sagen, warum ich diesen Fehler bekomme?
public class TestA {
String SomeString = "asd";
}
TestA testA = new TestA();
ObjectMapper om = new ObjectMapper();
try {
String testAString = om.writeValueAsString(testA); // error here!
TestA newTestA = om.readValue(testAString, TestA.class);
} catch (JsonGenerationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JsonMappingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Antworten:
Wie bereits beschrieben, besteht die Standardkonfiguration einer
ObjectMapper
Instanz darin, nur auf Eigenschaften zuzugreifen, die öffentliche Felder sind oder öffentliche Getter / Setter haben. Eine Alternative zum Ändern der Klassendefinition, um ein Feld öffentlich zu machen oder einen öffentlichen Getter / Setter bereitzustellen, besteht darin, (gegenüber dem zugrunde liegendenVisibilityChecker
) eine andere Sichtbarkeitsregel für Eigenschaften anzugeben . Jackson 1.9 bietet hierfür dieObjectMapper.setVisibility()
bequeme Methode. Für das Beispiel in der ursprünglichen Frage würde ich dies wahrscheinlich als konfigurierenFür Jackson> 2.0:
Für weitere Informationen und Details zu verwandten Konfigurationsoptionen empfehle ich, die JavaDocs unter zu
ObjectMapper.setVisibility()
überprüfen .quelle
myObjectMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
{"term":{"call_failed":"true"}}
Er generiert eine Yaml-Struktur als:filter: map: term: map: call_failed: "true"
Warum generiert er einmap
Schlüsselwort? Wie kann ich es entfernen?@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
über Ihrer Klasse hinzufügenDamit Jackson diese Klasse serialisieren kann, muss das
SomeString
Feld entweder seinpublic
(im Moment ist es Isolation auf Paketebene) oder Sie müssen Getter- und Setter-Methoden dafür definieren.quelle
Ich habe das gleiche Problem in meinem Quellcode. Ich habe gerade hinzugefügt
und
das Problem gelöst.
quelle
Das Problem in meinem Fall war, dass Jackson versuchte, ein leeres Objekt ohne Attribute oder Methoden zu serialisieren.
Wie in der Ausnahme vorgeschlagen, habe ich die folgende Zeile hinzugefügt, um Fehler bei leeren Beans zu vermeiden:
Für Jackson 1.9
Für Jackson 2.X.
Sie finden ein einfaches Beispiel für Jackson Disable Fail_on_empty_Beans
quelle
Ich hatte das gleiche Problem für eine untergeordnete Klasse, in der ich die Kontrolle hatte. Der Objekt-Mapper befand sich in einem gemeinsamen Modul und war nicht zugänglich. Ich habe es gelöst, indem ich diese Anmerkung für meine untergeordnete Klasse hinzugefügt habe, deren Objekt serialisiert werden sollte.
quelle
Wenn Sie die Klasse bearbeiten können, die dieses Objekt enthält, füge ich normalerweise nur die Anmerkung hinzu
quelle
org.codehaus.jackson.annotate.JsonIgnore
Dieser Fehler wird auch ausgelöst, wenn Sie vergessen, die Methode .build () zu Ihrem Rückgabestatus hinzuzufügen.
Ich habe den folgenden Fehler ohne build () -Methode erhalten:
quelle
SpringBoot2.0 , Ich löse es mit folgendem Code:
quelle
Fügen Sie für Oracle Java-Anwendungen Folgendes nach der
ObjectMapper
Instanziierung hinzu:quelle
Ich hatte ein ähnliches Problem mit dem verzögerten Laden über das Proxy-Objekt im Ruhezustand. Ich habe es umgangen, indem ich die Klasse mit faulen geladenen privaten Eigenschaften mit folgenden Anmerkungen versehen habe:
quelle
Das Problem kann sein, dass Sie die Variable als deklariert haben
private
. Wenn Sie es ändernpublic
, funktioniert es.Eine bessere Option ist die Verwendung von Getter- und Setter-Methoden.
Dies wird das Problem lösen!
quelle
Ich habe mindestens drei Möglichkeiten gefunden, dies zu tun:
public getters
Ihrer Entität hinzu, die Sie serialisieren möchten.public getters
. Dadurch wird die Standardeinstellung für Jackson dahingehend geändertVisbility=DEFAULT
,@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
dass Zugriffsmodifikatoren akzeptiert werden.ObjectMapper
globale EinstellungobjectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
. Dies sollte vermieden werden, wenn Sie diese Funktionalität nicht global benötigen.Wählen Sie basierend auf Ihren Bedürfnissen.
quelle
Hier sind die drei Optionen:
public
public
, fügen Sie Getter & Setter hinzu@JsonIgnore("context")
quelle
Bitte verwenden Sie dies auf Klassenebene für die Bohne:
quelle
Das Hinzufügen von Setter und Getter löst auch das Problem, wie es für mich behoben wurde. Zum Beispiel:
quelle
Ich hatte nur Getter, nachdem ich auch Setter hinzugefügt hatte, lösten sich die Probleme.
quelle
Obwohl ich Getter und Setter hinzugefügt habe, wurde der gleiche Fehler angezeigt. Später fand ich einen Fehler, dh nach Sonars Rat habe ich die Getter und Setter als geschützt eingestuft, was das Problem verursachte. Einmal habe ich behoben, dass es wie erwartet funktioniert hat.
quelle
im Frühjahr Boot 2.2.5
nach dem Hinzufügen von Getter und Setter
Ich habe @JsonIgnore oben auf dem Feld hinzugefügt.
quelle