Ich bekomme eine Ausnahme, wenn ich versuche, ein sehr einfaches Objekt mit Jackson zu serialisieren. Der Fehler:
org.codehaus.jackson.map.JsonMappingException: Kein Serializer für .__ gefunden. Klasse MyPackage.TestA und keine Eigenschaften hat festgestellt, dass BeanSerializer erstellt wird (um Ausnahmen zu vermeiden, deaktivieren Sie SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)
Nachfolgend finden Sie die einfache Klasse und den zu serialisierenden Code.
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();
}
Wie bereits beschrieben, besteht die Standardkonfiguration einer ObjectMapper
-Instanz darin, nur auf Eigenschaften zuzugreifen, die öffentliche Felder sind oder über öffentliche Getter/Setter verfügen. Eine Alternative zum Ändern der Klassendefinition, um ein Feld öffentlich zu machen oder einen öffentlichen Getter/Setter bereitzustellen, besteht darin (an die zugrunde liegende Variable VisibilityChecker
) eine andere Eigenschafts-Sichtbarkeitsregel anzugeben. Jackson 1.9 bietet hierfür die ObjectMapper.setVisibility()
-Komfortmethode. Für das Beispiel in der ursprünglichen Frage würde ich dies wahrscheinlich als konfigurieren
myObjectMapper.setVisibility(JsonMethod.FIELD, Visibility.ANY);
Für weitere Informationen und Details zu verwandten Konfigurationsoptionen empfehle ich die Überprüfung von der JavaDocs auf ObjectMapper.setVisibility()
.
Damit Jackson diese Klasse serialisieren kann, muss das Feld SomeString
entweder public
sein (im Moment ist es die Isolation auf Paketebene) oder Sie müssen Getter- und Setter-Methoden dafür definieren.
Ich habe das gleiche Problem in meinem Quellcode. Ich habe gerade hinzugefügt
getter
und
setter
das Problem gelöst.
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
myObjectMapper.configure(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false);
Für Jackson 2.X
myObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
Ein einfaches Beispiel finden Sie unter jackson disable fail_on_empty_beans
Ich hatte das gleiche Problem für eine Kinderklasse, in der ich die Kontrolle hatte. Object Mapper befand sich in einem gemeinsamen Modul und war nicht erreichbar. Ich löste es, indem ich diese Anmerkung für meine Kindklasse hinzufügte, deren Objekt serialisiert werden sollte.
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
Dieser Fehler wird auch ausgelöst, wenn Sie vergessen, die .build () -Methode Ihrem Rückgabestatus hinzuzufügen.
return Response.status(Status.OK); // fails
return Response.status(Status.OK).build(); // works
Ich habe den folgenden Fehler ohne build () - Methode erhalten:
org.codehaus.jackson.map.JsonMappingException: No serializer found for class com.Sun.jersey.core.spi.factory.ResponseBuilderImpl
Wenn Sie die Klasse bearbeiten können, die dieses Objekt enthält, füge ich normalerweise die Anmerkung hinzu
import com.fasterxml.jackson.annotation.JsonIgnore;
@JsonIgnore
NonSerializeableClass obj;
Fügen Sie dies für Oracle Java-Anwendungen nach der Instantiierung ObjectMapper
hinzu:
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Das Problem kann sein, dass Sie die Variable als private
..__ deklariert haben. Wenn Sie sie in public
ändern, funktioniert sie.
Eine bessere Option ist die Verwendung von Getter- und Setter-Methoden.
Das wird das Problem lösen!
Hier sind die drei Optionen:
public
sein.public
, fügen Sie Getters & Setter hinzu @JsonIgnore("context")
hinzuIch habe mindestens drei Wege gefunden, dies zu tun:
public getters
zu Ihrer Entität hinzu, die Sie zu serialisieren versuchen.public getters
nicht möchten. Dadurch wird der Standard für Jackson von Visbility=DEFAULT
in @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY)
geändert, wenn Zugriffsmodifizierer akzeptiert werden.ObjectMapper
global, indem Sie objectMapperInstance.setVisibility(JsonMethod.FIELD, Visibility.ANY);
einstellen. Dies sollte vermieden werden, wenn Sie diese Funktionalität nicht global benötigen.Wählen Sie nach Ihren Bedürfnissen.
Ich hatte ein ähnliches Problem mit dem verzögerten Laden über das Hibernate-Proxy-Objekt. Umging es durch Annotieren der Klasse, die private Objekte faul geladen hat:
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Obwohl ich Getter und Setzer hinzugefügt habe, bekam ich den gleichen Fehler. Später fand ich einen Fehler, nämlich durch Sonars Rat, dass ich die Getter und Setter als geschützt erkannte, was das Problem verursachte. Einmal habe ich behoben, dass es wie erwartet funktionierte.
SpringBoot2.0 resolve Ich löse es mit folgendem Code auf:
@Bean public ObjectMapper objectMapper() {
return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}