Frage

Jackson wirft eine seltsame Ausnahme, dass ich nicht weiß, wie sie zu beheben. Ich verwende Spring, Hibernate und Jackson.

Ich habe schon in Betracht gezogen, dass faul-Laden das Problem verursacht, aber ich habe Maßnahmen ergriffen, Jackson zu sagen, nicht verschiedene Eigenschaften verarbeiten wie folgt:

@JsonIgnoreProperties({ "sentMessages", "receivedMessages", "educationFacility" })
public class Director extends UserAccount implements EducationFacilityUser {
   ....
}

Ich habe auch das gleiche für alle anderen Useraccount Unterklassen erfolgen.

Hier ist die Ausnahme ausgelöst wird:

org.codehaus.jackson.map.JsonMappingException: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: java.util.ArrayList[46]->jobprep.domain.educationfacility.Director_$$_javassist_2["handler"])
    at org.codehaus.jackson.map.ser.StdSerializerProvider$1.serialize(StdSerializerProvider.java:62)
    at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:268)
    at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:146)
    at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:118)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:236)
    at org.codehaus.jackson.map.ser.ContainerSerializers$IndexedListSerializer.serializeContents(ContainerSerializers.java:189)
    at org.codehaus.jackson.map.ser.ContainerSerializers$AsArraySerializer.serialize(ContainerSerializers.java:111)
    at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:296)
    at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:224)
    at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:925)
    at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.writeInternal(MappingJacksonHttpMessageConverter.java:153)

Vorschläge, wie kann ich weitere Informationen bekommen kann, um zu sehen, was das verursacht? Wer weiß, wie man es beheben?

EDIT: entdeckte ich, dass getHander () und andere get * () Methoden existieren auf dem Proxy-Objekt. GRR !! Gibt es eine Möglichkeit, Jackson nicht verarbeiten, alles auf dem Proxy sagen kann, oder bin ich Sol? Das ist wirklich seltsam, weil das Verfahren, dass spuckt die JSON nur unter bestimmten Umständen abstürzt, nicht die ganze Zeit. Dennoch ist es aufgrund der get * () Methoden auf dem Proxy-Objekt.

Neben: Proxies sind böse. Sie stören Jackson, equals () und vielen anderen Teilen der regelmäßigen Java-Programmierung. Ich bin Hibernate versucht ganz zu Graben: /

War es hilfreich?

Lösung

Es ist nicht ideal, aber man konnte Jacksons automatische Erkennung von JSON Eigenschaften, mit @JsonAutoDetect auf Klassenebene deaktivieren. Dies würde verhindern, dass es versucht, die Javassist Sachen (und nicht an).

zu handhaben

Das bedeutet, dass Sie dann jedes Getter mit Anmerkungen versehen müssen manuell (mit @JsonProperty), aber das ist nicht unbedingt eine schlechte Sache, da es Dinge explizit hält.

Andere Tipps

Ich hatte ein ähnliches Problem mit verzögertes Laden über das Hibernate-Proxy-Objekt. Got um es durch die Klasse mit Anmerkungen versehen zu haben lazyloaded private Eigenschaften mit:

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

Ich nehme an, Sie die Eigenschaften auf Ihrem Proxy-Objekt hinzufügen können, dass bricht die JSON-Serialisierung auf diese Anmerkung.

Vermeiden Jackson Serialisierung auf nicht geholt faul Objekte

Ich habe den gleichen Fehler, aber ohne Beziehung zu Hibernate. Ich habe hier von allen erschreckend Vorschläge Angst, die ich bei Hibernate und verzögertes Laden relevant erraten ... i in meinem Fall jedoch bekam den Fehler, da in einer inneren Klasse i keine Getter / Setter hatte, so dass die BeanSerializer konnte nicht die Daten serialisiert ...

Hinzufügen von Getter und Setter löste das Problem.

Für das, was es wert ist, gibt es Jackson Hibernate-Modul Projekt, dass gerade erst begonnen, und die dieses Problem lösen soll und hoffentlich auch andere. Das Projekt wird nach Jackson Vorhaben, die aber nicht Teil der Kernquelle. Dies ist meist einfachen Freigabeprozess zu ermöglichen; es erfordert Jackson 1.7 wie das ist, wenn Modul-API eingeführt wird.

Ich hatte das gleiche Problem. Sehen Sie, wenn Sie hibernatesession.load() verwenden. Wenn ja, versuchen zu hibernatesession.get() konvertieren. Dies löste mein Problem.

Ich hatte die gleiche Fehlermeldung vom Frühjahr der @RestController. Meine Ruhe Controller-Klasse wurde mit JpaRepository Klasse Feder und durch repository.getOne(id) Methodenaufruf mit repository.findOne(id) Problem zu ersetzen war verschwunden.

Sie können mit jackson-Datentyp-Hibernate-Modul, dieses Problem zu lösen. Es funktioniert für mich. Referenz: https://github.com/FasterXML/jackson-datatype-hibernate

ähnlich wie bei anderen Antworten, das Problem war für mich eine many-to-one Spalte erklärt faul fetching zu tun. Der Wechsel zu eifrigen fetching das Problem behoben. Vorher:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.LAZY)

Nach:

@ManyToOne(targetEntity = StatusCode.class, fetch = FetchType.EAGER)

Sie könnten @JsonIgnoreProperties(value = { "handler", "hibernateLazyInitializer" }) Anmerkung auf Ihrer Klasse „Direktor“

verwenden

Sie können einen Jackson mixin auf Object.class in der immer ignorieren winter bezogenen Eigenschaften. Wenn Sie Frühlings-Boot verwenden dieses in Ihrer Anwendungsklasse:

@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
    Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder();
    b.mixIn(Object.class, IgnoreHibernatePropertiesInJackson.class);
    return b;
}


@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
private abstract class IgnoreHibernatePropertiesInJackson{ }

Ich bin neu in Jackson API, wenn ich das bekam „org.codehaus.jackson.map.JsonMappingException: Nein Serializer für Klasse com.company.project.yourclass gefunden“, fügte ich die Getter und Setter zu com.company. project.yourclass, das half mir die ObjectMapper des Mapperobjekt zu verwenden, um das Java-Objekt in eine flache Datei zu schreiben.

stand ich vor dem gleichen Problem, und es ist wirklich seltsam, dass der gleiche Code in wenigen Fall arbeitet, während es in einigen zufälligen Fällen fehlgeschlagen.

Ich habe es behoben, indem nur sicherstellen, dass die richtigen Setter / Getter (Sicherstellen, dass die Groß- und Kleinschreibung)

Ich habe versucht @JsonDetect und

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

Keiner von ihnen für mich gearbeitet. Mit Hilfe eines Drittanbieters Modul wie eine Menge Arbeit zu mir schien. Also habe ich nur versucht, einen get Anruf auf jeder Eigenschaft des faulen Objekts erzeugt werden, bevor sie für serlization zu jackson vorbei. Der Arbeits Code-Snippet sah so etwas wie folgt aus:

@RequestMapping(value = "/authenticate", produces = "application/json; charset=utf-8")
    @ResponseBody
    @Transactional
    public Account authenticate(Principal principal) {
        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal;
        LoggedInUserDetails loggedInUserDetails = (LoggedInUserDetails) usernamePasswordAuthenticationToken.getPrincipal();
        User user = userRepository.findOne(loggedInUserDetails.getUserId());
        Account account = user.getAccount();
        account.getFullName();      //Since, account is lazy giving it directly to jackson for serlization didn't worked & hence, this quick-fix.
        return account;
    }

Auch können Sie Ihren Domain-Objekt Director endgültig machen. Es ist nicht perfekte Lösung, aber es verhindert Proxy-Unterklasse von Ihnen Domain-Klasse erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top