Kein Serializer für die Klasse org.hibernate.proxy.pojo.javassist.Javassist gefunden?

94

Ich arbeite an SpringMVC, Hibernate& JSONaber ich diese Störung erhalte.

HTTP Status 500 - Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) 

Bitte überprüfen Sie meine Entität unten

    @Entity
@Table(name="USERS")
public class User {

    @Id
    @GeneratedValue
    @Column(name="USER_ID")
    private Integer userId;

    @Column(name="USER_FIRST_NAME")
    private String firstName;

    @Column(name="USER_LAST_NAME")
    private String lastName;


    @Column(name="USER_MIDDLE_NAME")
    private String middleName;

    @Column(name="USER_EMAIL_ID")
    private String emailId;

    @Column(name="USER_PHONE_NO")
    private Integer phoneNo;

    @Column(name="USER_PASSWORD")
    private String password;

    @Column(name="USER_CONF_PASSWORD")
    private String  confPassword;

    @Transient
    private String token;

    @Column(name="USER_CREATED_ON")
    private Date createdOn;

    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "USER_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    private List<ActifioRoles> userRole = new ArrayList<ActifioRoles>();


    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="userDetails")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<com.actifio.domain.Address> userAddress = new ArrayList<com.actifio.domain.Address>();

    @OneToOne(cascade=CascadeType.ALL)
    private Tenant tenantDetails;


    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmailId() {
        return emailId;
    }
    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getConfPassword() {
        return confPassword;
    }
    public void setConfPassword(String confPassword) {
        this.confPassword = confPassword;
    }
    public Date getCreatedOn() {
        return createdOn;
    }
    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public List<ActifioRoles> getUserRole() {
        return userRole;
    }

    public void setUserRole(List<ActifioRoles> userRole) {
        this.userRole = userRole;
    }
    public String getMiddleName() {
        return middleName;
    }
    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }
    public Integer getPhoneNo() {
        return phoneNo;
    }
    public void setPhoneNo(Integer phoneNo) {
        this.phoneNo = phoneNo;
    }

    public List<com.actifio.domain.Address> getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(List<com.actifio.domain.Address> userAddress) {
        this.userAddress = userAddress;
    }
    public Tenant getTenantDetails() {
        return tenantDetails;
    }
    public void setTenantDetails(Tenant tenantDetails) {
        this.tenantDetails = tenantDetails;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }

    }

Wie kann ich das lösen?

user2963481
quelle
Bitte zeigen Sie den Stacktrace und den Code, wo die Ausnahme auftritt
Geo und
Ohne zu wissen, was Ihr Code versucht, ist das Debuggen etwas schwierig, aber Sie sollten wahrscheinlich github.com/FasterXML/jackson-datatype-hibernate überprüfen, da Sie Jackson und Hibernate
geoand verwenden
Versuchen Sie, aus dieser Klasse einen JSON zu erstellen? In diesem Fall versucht der JSON-Serializer, alle Eigenschaften zu schreiben, auch das HashSet Ihrer Viele-zu-Viele-Beziehungen. Dies macht eine verzögerte Initialisierungsausnahme
Angelo Immediata
Die gleiche Frage finden Sie unter stackoverflow.com/questions/4362104/…
Matrix Buster
@ user2963481 ... Schöne und sehr hilfreiche Frage Bro.
Gehirn

Antworten:

192

Ich hatte ein ähnliches Problem mit dem verzögerten Laden über das Ruhezustand-Proxy-Objekt. Ich habe es umgangen, indem ich die Klasse mit faulen geladenen privaten Eigenschaften mit folgenden Anmerkungen versehen habe:

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

Ich gehe davon aus, dass Sie die Eigenschaften Ihres Proxy-Objekts, die die JSON-Serialisierung unterbrechen, zu dieser Annotation hinzufügen können.

Das Problem ist, dass Entitäten träge geladen werden und die Serialisierung erfolgt, bevor sie vollständig geladen werden.

Hibernate.initialize(<your getter method>);
Ankur Singhal
quelle
3
Es hat auch bei mir funktioniert ... Gibt es eine Erklärung für dieses seltsame Verhalten?
Victor
7
@ ankur-singhal Sie sollten betonen, dass diese Annotation für die verschachtelte Klasse und NICHT für die aufrufende Klasse benötigt wird.
Darwayne
1
Yahoo ... es hat funktioniert. Ich habe es ein paar Mal versucht und gearbeitet. Ich habe ein paar Möglichkeiten ausprobiert und BoooM. Hat funktioniert.
Gehirn
2
Danke hat auch für mich funktioniert. Sie müssen diese Anmerkung zu Entitäten hinzufügen, die auf andere Entitäten mit verzögert geladenen Beans zugreifen.
Shafqat Shafi
3
Ich denke, dies ist keine richtige Lösung für das Problem. Bei der Serialisierung erwarten wir, dass entweder das vollständige Unterobjekt oder zumindest der Primärschlüssel des Unterobjekts im Ergebnis zurückgegeben wird. Das Hinzufügen dieser Anmerkungen unterdrückt nur den Fehler, liefert jedoch nicht die gewünschten Ergebnisse.
Anand Vaidya
84

Um dies hinzuzufügen, bin ich auf dasselbe Problem gestoßen, aber die bereitgestellten Antworten haben nicht funktioniert. Ich habe das Problem behoben, indem ich den Vorschlag der Ausnahme aufgegriffen und zur Datei application.properties hinzugefügt habe ...

spring.jackson.serialization.fail-on-empty-beans=false

Ich verwende Spring Boot v1.3 mit Hibernate 4.3

Es serialisiert jetzt das gesamte Objekt und verschachtelte Objekte.

EDIT: 2018

Da dies noch Kommentare bekommt, werde ich hier klarstellen. Dies verbirgt absolut nur den Fehler. Die Auswirkungen auf die Leistung sind da. Zu der Zeit brauchte ich etwas, um es zu liefern und später daran zu arbeiten (was ich tat, indem ich keine Feder mehr benutzte). Also ja, hören Sie jemand anderem zu, wenn Sie das Problem wirklich lösen möchten. Wenn Sie es erst einmal weg haben möchten, verwenden Sie diese Antwort. Es ist eine schreckliche Idee, aber zum Teufel, könnte für Sie arbeiten. Für die Aufzeichnung, hatte nie wieder einen Absturz oder ein Problem danach. Aber es ist wahrscheinlich die Quelle eines SQL-Performance-Alptraums.

CP510
quelle
8
Löst das Problem, aber JSON wird zwei zusätzliche nicht benötigte Eigenschaften enthalten"handler":{},"hibernateLazyInitializer":{}
Prettyvoid
großartig! Auch hier behoben, ist dies die Antwort
Hinotori
@prettyvoid Warum gibt es diese zusätzlichen Eigenschaften?
Robert Moon
12
@ RobertMoon Wenn Sie sie loswerden möchten, können Sie Ihre Entität mit kommentieren@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
ziemlichvoid
@ Prettyvoid Danke. Ich fand eine andere Lösung darin, LAZY in EAGER zu ändern. Beeinträchtigt es eine Leistung?
Robert Moon
68

Wie in früheren Antworten richtig vorgeschlagen, bedeutet verzögertes Laden, dass beim Abrufen Ihres Objekts aus der Datenbank die verschachtelten Objekte nicht abgerufen werden (und bei Bedarf möglicherweise später abgerufen werden).

Jetzt versucht Jackson, das verschachtelte Objekt zu serialisieren (== JSON daraus zu machen), schlägt jedoch fehl, da JavassistLazyInitializer anstelle des normalen Objekts gefunden wird. Dies ist der Fehler, den Sie sehen. Wie kann man das lösen?

Wie zuvor von CP510 vorgeschlagen, besteht eine Option darin, den Fehler durch diese Konfigurationszeile zu unterdrücken:

spring.jackson.serialization.fail-on-empty-beans=false

Aber es geht um die Symptome, nicht um die Ursache . Um es elegant zu lösen, müssen Sie entscheiden, ob Sie dieses Objekt in JSON benötigen oder nicht.

  1. Wenn Sie das Objekt in JSON benötigen, entfernen Sie die FetchType.LAZYOption aus dem Feld, das sie verursacht (es kann sich auch um ein Feld in einem verschachtelten Objekt handeln, nicht nur in der Stammentität, die Sie abrufen).

  2. Wenn Sie das Objekt in JSON nicht benötigen, kommentieren Sie den Getter dieses Felds (oder das Feld selbst, wenn Sie auch keine eingehenden Werte akzeptieren müssen) mit @JsonIgnore:

    // this field will not be serialized to/from JSON @JsonIgnore private NestedType secret;

Wenn Sie komplexere Anforderungen haben (z. B. unterschiedliche Regeln für unterschiedliche REST-Controller, die dieselbe Entität verwenden), können Sie Jackson- Ansichten oder -Filter verwenden oder für einen sehr einfachen Anwendungsfall verschachtelte Objekte separat abrufen .

MF.OX
quelle
15
Dies ist die beste Antwort. Beheben Sie die Ursache des Problems und maskieren Sie nicht nur die Symptome, mit denen sich der nächste Programmierer befassen muss.
Andrew
2
Sie sind mein Held.
Lay Leangsros
Vielen Dank, dass Sie den Grund für den Fehler erklärt und zwei sinnvolle Lösungen bereitgestellt haben
Mauricio Poppe,
Vielen Dank dafür, aber ich sehe, Springfox-Prahlerei gibt mir immer noch FehlerRangeError: Maximum call stack size exceeded
Pra_A
18

Sie können das Zusatzmodul für Jackson verwenden, das das verzögerte Laden im Ruhezustand übernimmt.

Weitere Informationen unter https://github.com/FasterXML/jackson-datatype-hibernate , die den Ruhezustand 3 und 4 separat unterstützen.

Marco Andreini
quelle
7
Dies sollte wirklich die richtige Antwort sein. Alle anderen Antworten verbergen das Problem, anstatt es zu lösen.
Ahmed Hassanien
Aber wie benutzt man dieses Modul? Gibt es einen Leitfaden dafür?
Anand Vaidya
Möglichkeiten zum Konfigurieren von jackson-datatype-hibernate: stackoverflow.com/q/33727017
Chase
13

Ich denke, dass das Problem darin besteht, wie Sie die Entität abrufen.

Vielleicht machst du so etwas:

Person p = (Person) session.load(Person.class, new Integer(id));

Versuchen Sie es mit der Methode getanstelle vonload

Person p = (Person) session.get(Person.class, new Integer(id));

Das Problem ist, dass Sie mit der Lademethode nur einen Proxy erhalten, aber nicht das eigentliche Objekt. Für das Proxy-Objekt sind die Eigenschaften noch nicht geladen. Wenn die Serialisierung erfolgt, müssen keine Eigenschaften serialisiert werden. Mit der get-Methode erhalten Sie tatsächlich das reale Objekt, dieses Objekt könnte tatsächlich serialisiert werden.

Carlos Zegarra
quelle
2
Ein sehr ähnlicher Fehler ist mir passiert, als ich getOne anstelle von findOne verwendet habe. In meinem Fall hat mein Schnittstellen-Repository JpaRepository erweitert. findOne funktionierte gut ohne Json-Anmerkungen oder Änderungen in application.properties
James Freitas
Wie James Freitas stellte ich auch fest, dass getOne zu dem Problem führte und stattdessen beispielsweise findById verwendete, um das Problem zu lösen, ohne die Anmerkung oder die oben angegebene Zeile in den Anwendungseigenschaften verwenden zu müssen
MY
1
Mein Arbeitskollege hat mich klargestellt und gesagt: "Der grundlegende Unterschied besteht darin, dass getOne faul geladen wird und findOne nicht" - was offensichtlich bedeutet, dass ersterer keine Datenzeilen von der Datenbank erhält, sondern nur Referenzen erstellt. Letzteres bekommt stattdessen tatsächlich Zeilen, was häufig erwünscht ist
MEIN
@ JamesFreitas JA! Danke dir! Und danke Carlos, dass du James zu diesem schönen Abschluss geführt hast!
Filip Savic
9

Für mich geht das

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

z.B

@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Date created;

}
GiraffeTree
quelle
5

Es gibt zwei Möglichkeiten, um das Problem zu beheben.

Weg 1 :

spring.jackson.serialization.fail-on-empty-beans=falseIn application.properties hinzufügen

Weg 2 :

Verwendung join fetchin JPQL Abfrage übergeordnetes Objekt Daten abrufen, siehe unten:

@Query(value = "select child from Child child join fetch child.parent Parent ",
           countQuery = "select count(*) from Child child join child.parent parent ")
public Page<Parent> findAll(Pageable pageable); 
Fanging
quelle
Vielen Dank! Die erste Lösung ist großartig!
Lucas Moyano Angelini
Weg 1. Großartig. Danke dir.
Lay Leangsros
3

Fügen Sie diese Anmerkung zur Entitätsklasse (Modell) hinzu, die für mich funktioniert, da dies zu einem verzögerten Laden über das Proxy-Objekt im Ruhezustand führt.

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

Akitha_MJ
quelle
2

Diese Ausnahme

org.springframework.http.converter.HttpMessageNotWritableException

Ich hoffe, Sie senden eine Antwortausgabe als serialisierbares Objekt.
Dies ist ein Problem, das im Frühjahr auftritt. Um dieses Problem zu beheben, senden Sie das POJO-Objekt als Antwortausgabe.

Beispiel:

    @Entity
    @Table(name="user_details")
    public class User implements Serializable{

        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Column(name="id")
        private Integer id;

        @Column(name="user_name")
        private String userName;

        @Column(name="email_id")
        private String emailId;

        @Column(name="phone_no")
        private String phone;

//setter and getters

POJO-Klasse:

public class UserVO {

    private int Id;
    private String userName;
    private String emailId;
    private String phone;
    private Integer active;

//setter and getters

In der Steuerung konvertieren Sie die serilisierbaren Objektfelder in POJO-Klassenfelder und geben die Pojo-Klasse als Ausgabe zurück.

         User u= userService.getdetials(); // get data from database

        UserVO userVo= new UserVO();  // created pojo class object

        userVo.setId(u.getId());
        userVo.setEmailId(u.getEmailId());
        userVo.setActive(u.getActive());
        userVo.setPhone(u.getPhone());
        userVo.setUserName(u.getUserName());
       retunr userVo;  //finally send pojo object as output.
Sai Goud
quelle
Ja, ich mache das Gleiche, aber selbst wenn ich das Gleiche mache,
erhalte
2

In Hibernate 5.2 und höher können Sie den Hibernate-Proxy wie folgt entfernen. Dadurch erhalten Sie das eigentliche Objekt, damit Sie es ordnungsgemäß serialisieren können:

Object unproxiedEntity = Hibernate.unproxy( proxy );
GMsoF
quelle
es wird auch Hibernate.initializevorher automatisch angerufen .
GMsoF
@ Tim, sollte vor der JSON-Serialisierung hinzugefügt werden. Das Problem tritt auf, weil während der Serialisierung ein Proxy-Objekt im Ruhezustand gefunden wurde. Sobald es entfernt wurde, ist die Serialisierung in Ordnung. Wenn Sie einen Federregler verwenden, müssen Sie dies vor dem Ende des Reglers tun.
GMsoF
1

Für den Ruhezustand können Sie den Jackson-Datentyp-Ruhezustand verwenden Projekt , um die JSON-Serialisierung / -Deserialisierung mit verzögert geladenen Objekten zu ermöglichen.

Beispielsweise,

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonDatatypeHibernate5Configuration {

    // Register Jackson Hibernate5 Module to handle JSON serialization of lazy-loaded entities
    // Any beans of type com.fasterxml.jackson.databind.Module are automatically
    // registered with the auto-configured Jackson2ObjectMapperBuilder
    // https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
    @Bean
    public Module hibernate5Module() {
        Hibernate5Module hibernate5Module = new Hibernate5Module();
        hibernate5Module.enable( Hibernate5Module.Feature.FORCE_LAZY_LOADING );
        hibernate5Module.disable( Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION );
        return hibernate5Module;
    }
}
Philip Wrage
quelle
Wenn ich das benutzt habe, dann bekomme ich can't parse JSON. Raw result:. Irgendeine Hilfe?
Pra_A
1

Die Lösung ist von der folgenden Lösung von @marco inspiriert. Ich habe auch seine Antwort mit diesen Daten aktualisiert.

Das Problem hierbei ist das verzögerte Laden der Unterobjekte, bei denen Jackson nur Proxys im Ruhezustand anstelle von vollständigen Objekten findet.

Wir haben also zwei Möglichkeiten: Unterdrücken Sie die Ausnahme, wie oben in der Antwort mit den meisten Abstimmungen hier beschrieben, oder stellen Sie sicher, dass die LazyLoad-Objekte geladen sind.

Wenn Sie sich für die letztere Option entscheiden, besteht die Lösung darin, die Jackson-Datentypbibliothek zu verwenden und die Bibliothek so zu konfigurieren, dass Abhängigkeiten beim verzögerten Laden vor der Serialisierung initialisiert werden.

Ich habe dazu eine neue Konfigurationsklasse hinzugefügt.

@Configuration
public class JacksonConfig extends WebMvcConfigurerAdapter {

@Bean
@Primary
public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();
    Hibernate5Module module = new Hibernate5Module();
    module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);
    mapper.registerModule(module);
    messageConverter.setObjectMapper(mapper);
    return messageConverter;
}

}}

@Primarystellt sicher, dass keine andere Jackson-Konfiguration zum Initialisieren anderer Beans verwendet wird. @Beanist wie immer. module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);soll das verzögerte Laden der Abhängigkeiten aktivieren.

Achtung - Bitte achten Sie auf die Auswirkungen auf die Leistung. Manchmal hilft EAGER-Abruf, aber selbst wenn Sie es eifrig machen, benötigen Sie diesen Code immer noch, da Proxy-Objekte für alle anderen Zuordnungen außer noch vorhanden sind@OneToOne

PS: Als allgemeinen Kommentar würde ich davon abraten, ganze Datenobjekte in der Json-Antwort zurückzusenden. Man sollte Dto's für diese Kommunikation verwenden und einen Mapper wie mapstruct verwenden, um sie abzubilden. Dies erspart Ihnen versehentliche Sicherheitslücken sowie die oben genannten Ausnahmen.

Anand Vaidya
quelle
1

Ich habe jetzt das gleiche Problem. Überprüfen Sie, ob Sie Fetch in Lazy mit einem @jsonIQgnore beheben

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;

Löschen Sie einfach "(fetch = ...)" oder die Anmerkung "@jsonIgnore" und es wird funktionieren

@ManyToOne
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;
Aminoz
quelle
0

Oder Sie können Mapper wie folgt konfigurieren:

// benutzerdefinierte Konfiguration für verzögertes Laden

public static class HibernateLazyInitializerSerializer extends JsonSerializer<JavassistLazyInitializer> {

    @Override
    public void serialize(JavassistLazyInitializer initializer, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeNull();
    }
}

und Mapper konfigurieren:

    mapper = new JacksonMapper();
    SimpleModule simpleModule = new SimpleModule(
            "SimpleModule", new Version(1,0,0,null)
    );
    simpleModule.addSerializer(
            JavassistLazyInitializer.class,
            new HibernateLazyInitializerSerializer()
    );
    mapper.registerModule(simpleModule);
ahll
quelle
0

Es könnte sich um Ihre Entität im Ruhezustand handeln, die das Problem verursacht. Beenden Sie einfach das verzögerte Laden dieser verwandten Entität. Beispiel: Ich habe das Problem unten gelöst, indem ich für customerType faul = "false" gesetzt habe.

<class name="Customer" table="CUSTOMER">
        <id name="custId" type="long">
            <column name="CUSTID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" />
        </property>
        <property name="pan" type="java.lang.String">
            <column name="PAN" />
        </property>

        <many-to-one name="customerType" not-null="true" lazy="false"></many-to-one>
    </class>
</hibernate-mapping>
bjethwan
quelle
1
Bitte informieren Sie in Ihrem Beitrag, dass dies in der Praxis eine sehr gefährliche Lösung sein kann.
Panurg
0

Ich habe mich geändert (in der Annotation-Modellklasse)

fetch = FetchType.LAZY

zu

fetch = FetchType.EAGER

und auf hübsche Weise gearbeitet ...

Liebe es.

Schein Fiorin
quelle
5
Dies löst zwar das Problem, ist aber sehr gefährlich. Das Ändern der fetchStrategie für ein Modell hat mehrere Konsequenzen für die Leistung. Mit dieser Änderung bringen Sie viel mehr Daten aus der Datenbank. Es mag eine gültige Lösung sein, aber zuerst ist eine Leistungsstudie erforderlich.
João Menighin
1
Wenn Sie wissen, dass Sie ein Model sind und nicht viele Entitäten miteinander verbunden sind, können Sie ein wenig Mem und Leistung aufwenden, um eine vollständige Entität zu erhalten. aber es ist gut zu wissen, dass es immer am besten ist, LAZY fetch zu verwenden
Sham Fiorin
0

Dies ist ein Problem mit Jackson. Um dies zu verhindern, weisen Sie Jackson an, keine verschachtelten Beziehungen oder verschachtelten Klassen zu serialisieren.

Schauen Sie sich das folgende Beispiel an. Adressklasse, die den Klassen Stadt , Bundesland und Land zugeordnet ist , und der Staat selbst zeigt auf Land und Land auf Region. Wenn Sie Adresswerte über die Spring Boot REST-API abrufen, wird der obige Fehler angezeigt. Um dies zu verhindern, serialisieren Sie einfach die zugeordnete Klasse (die JSON der ersten Ebene widerspiegelt) und ignorieren Sie verschachtelte Beziehungen mit @JsonIgnoreProperties(value = {"state"}), @JsonIgnoreProperties(value = {"country"})und @JsonIgnoreProperties(value = {"region"})

Dies verhindert eine Lazyload-Ausnahme zusammen mit dem obigen Fehler. Verwenden Sie den folgenden Code als Beispiel und ändern Sie Ihre Modellklassen.

Address.java

@Entity
public class Address extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 4203344613880544060L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "street_name")
    private String streetName;

    @Column(name = "apartment")
    private String apartment;

    @ManyToOne
    @JoinColumn(name = "city_id")
    @JsonIgnoreProperties(value = {"state"})
    private City city;

    @ManyToOne
    @JoinColumn(name = "state_id")
    @JsonIgnoreProperties(value = {"country"})
    private State state;

    @ManyToOne
    @JoinColumn(name = "country_id")
    @JsonIgnoreProperties(value = {"region"})
    private Country country;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;

    @Column(name = "zip_code")
    private String zipCode;

    @ManyToOne
    @JoinColumn(name = "address_type_id", referencedColumnName = "id")
    private AddressType addressType;

}

City.java

@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "city")
@Cache(region = "cityCache",usage = CacheConcurrencyStrategy.READ_WRITE)
@Data
public class City extends AbstractAuditingEntity
{
    private static final long serialVersionUID = -8825045541258851493L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    //@Length(max = 100,min = 2)
    private String name;


    @ManyToOne
    @JoinColumn(name = "state_id")
    private State state;
}

State.java

@Entity
@Table(name = "state")
@Data
@EqualsAndHashCode(callSuper = true)
public class State extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 5553856435782266275L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "code")
    private String code;

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "country_id")
    private Country country;

}

Country.java

@Entity
@Table(name = "country")
@Data
@EqualsAndHashCode(callSuper = true)
public class Country extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 6396100319470393108L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @Column(name = "code")
    @Length(max = 3, min = 2)
    private String code;

    @Column(name = "iso_code")
    @Length(max = 3, min = 2)
    private String isoCode;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;
}
Jadda
quelle
-5

Versuchen

implements interface Serializable

Borino
quelle