wake-up-neo.net

Serialisierung mit Jackson (JSON) - "Kein Serializer gefunden"?

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();
}
211
Ted

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() .

279

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.

64
Chris

Ich habe das gleiche Problem in meinem Quellcode. Ich habe gerade hinzugefügt 

getter

und 

setter

das Problem gelöst.

35

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

20
Martín C

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)
6
Pavan Kumar

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
5
patrics

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;
5
ZiglioUK

Fügen Sie dies für Oracle Java-Anwendungen nach der Instantiierung ObjectMapper hinzu: 

mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
3
LEMUEL ADANE

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!

2

Hier sind die drei Optionen:

  1. Daten/Klassen, auf die zugegriffen wurde, müssen public sein.
  2. Wenn nicht public, fügen Sie Getters & Setter hinzu
  3. Oder fügen Sie @JsonIgnore("context") hinzu
2
Santhosh Kumar

Ich habe mindestens drei Wege gefunden, dies zu tun:

  1. Fügen Sie public getters zu Ihrer Entität hinzu, die Sie zu serialisieren versuchen.
  2. Fügen Sie am Anfang der Entität eine Anmerkung hinzu, wenn Sie 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.
  3. Ändern Sie Ihre 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.

1
georger

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"})
1
N. berouain

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.

0
yellow

SpringBoot2.0 resolve Ich löse es mit folgendem Code auf:

@Bean public ObjectMapper objectMapper() {
 return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);}
0
Janus