2016-07-17 16 views
0

私は、相互に双方向マッピングを持つエンティティを持っています。 DBからすべてのレコードを取得するためにREST Http.GETリクエストを呼び出すと、無限再帰のためにStackOverflowExceptionが返されます。私は、@ JsonIgnore、@ JsonBackReferenceと@JsonManageReferenceおよび@JsonIdentityInfoを異なる組み合わせで使用しようとしていましたが、肯定的な結果は得られませんでした。私はまだエラーを受けています。Springブート - jsonへのエンティティ - 再帰

スプリングブートは、バージョン2.6.6のme jacksonをロードします。

@MappedSuperclass 
public class BaseEntity { 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String createdBy; 
    private Date createdOn; 
    private String modifiedBy; 
    private Date modifiedOn; 
    public String description; 

    public BaseEntity() { 
    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getCreatedBy() { 
     return createdBy; 
    } 

    public void setCreatedBy(String createdBy) { 
     this.createdBy = createdBy; 
    } 

    public Date getCreatedOn() { 
     return createdOn; 
    } 

    public void setCreatedOn(Date createdOn) { 
     this.createdOn = createdOn; 
    } 

    public String getModifiedBy() { 
     return modifiedBy; 
    } 

    public void setModifiedBy(String modifiedBy) { 
     this.modifiedBy = modifiedBy; 
    } 

    public Date getModifiedOn() { 
     return modifiedOn; 
    } 

    public void setModifiedOn(Date modifiedOn) { 
     this.modifiedOn = modifiedOn; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(String description) { 
     this.description = description; 
    } 
} 

第1エンティティクラス:

@Entity 
public class Entry extends BaseEntity{ 

    private Date businessOperationDate; 

    @ManyToOne 
    private Version version; 

    @ManyToOne 
    private Status status; 

    @ManyToOne 
    @JsonManagedReference 
    private Account account; 

    public Entry() { 
    } 

    public Date getBusinessOperationDate() { 
     return businessOperationDate; 
    } 

    public void setBusinessOperationDate(Date businessOperationDate) { 
     this.businessOperationDate = businessOperationDate; 
    } 

    public Version getVersion() { 
     return version; 
    } 

    public void setVersion(Version version) { 
     this.version = version; 
    } 

    public Status getStatus() { 
     return status; 
    } 

    public void setStatus(Status status) { 
     this.status = status; 
    } 

    public Account getAccount() { 
     return account; 
    } 

    public void setAccount(Account account) { 
     this.account = account; 
    } 
} 

と第二1:ここでは

@Entity 
public class Account extends BaseEntity{ 
    private String number; 

    @OneToMany(mappedBy = "account", fetch = FetchType.EAGER) 
    @JsonBackReference 
    private List<Entry> entries; 

    @ManyToMany(mappedBy = "accounts") 
    private List<Project> projects; 

    public Account() { 
    } 

    public String getNumber() { 
     return number; 
    } 

    public void setNumber(String number) { 
     this.number = number; 
    } 

    public List<Entry> getEntries() { 
     return entries; 
    } 

    public void setEntries(List<Entry> entries) { 
     this.entries = entries; 
    } 

    public List<Project> getProjects() { 
     return projects; 
    } 

    public void setProjects(List<Project> projects) { 
     this.projects = projects; 
    } 
} 

は、HTTPから受信した結果の一部を見つけることができます

は、ここに私のBaseEntityです。 GETリクエスト:

[{"id":1,"createdBy":null,"createdOn":null,"modifiedBy":null,"modifiedOn":null,"description":"pierwszy zapis","businessOperationDate":null,"version":null,"status":null,"account":{"id":1,"createdBy":null,"createdOn":null,"modifiedBy":null,"modifiedOn":null,"description":"pierwszy projekt","number":null,"entries": 
[{"id":1,"createdBy":null,"createdOn":null,"modifiedBy":null,"modifiedOn":null,"description":"pierwszy zapis","businessOperationDate":null,"version":null,"status":null,"account":{"id":1,"createdBy":null,"createdOn":null,"modifiedBy":null,"modifiedOn":null,"description":"pierwszy projekt","number":null,"entries": 
[{"id":1,"createdBy":null,"createdOn":null,"modifiedBy":null,"modifiedOn":null,"description":"pierwszy zapis","{"timestamp":1468778765328,"status":200,"error":"OK","exception":"org.springframework.http.converter.HttpMessageNotWritableException","message": 
"Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.test.test2.core.dto.AccountDto[\"entries\"]-> 
java.util.ArrayList[0]->com.test.test2.core.dto.EntryDto[\"account\"]->com.test.test2.core.dto.AccountDto[\"entries\"]-> 
java.util.ArrayList[0]->com.test.test2.core.dto.EntryDto[\"account\"]->com.test.test2.core.dto.AccountDto[\"entries\"]->java.util.ArrayList[0]->com.test.test2.core.dto.EntryDto[\"account\"]->com.test.test2.core.dto.AccountDto[\"entries\"]-> 
java.util.ArrayList[0]->com.test.test2.core.dto.EntryDto[\"account\"]- 

pom.xmlファイル:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.test</groupId> 
    <artifactId>test2</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>test2</name> 
    <description>test2</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.3.5.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-jpa</artifactId> 
     </dependency> 
     <!--<dependency>--> 
      <!--<groupId>org.springframework.boot</groupId>--> 
      <!--<artifactId>spring-boot-starter-security</artifactId>--> 
     <!--</dependency>--> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>org.postgresql</groupId> 
      <artifactId>postgresql</artifactId> 
      <scope>runtime</scope> 
      <version>9.4-1201-jdbc41</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 

     <!-- model mapper --> 
     <dependency> 
      <groupId>ma.glasnost.orika</groupId> 
      <artifactId>orika-core</artifactId> 
      <version>1.4.6</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 

</project> 

私が間違っているの何を、教えてください。結果として1つのレベルだけを受け取ることを希望します。エントリのためにgetAll()を呼び出すと、アカウントに関連する情報を持つすべてのエントリを受け取って、逆にアカウントのgetAll()を呼び出したいとします。

+0

でください私は、このエラーのために多くの時間を検索し、私はいくつかの関係マッピングで注釈@JsonIgnoreを追加することによって、私は、このエラーの場合取得し、私はそれを修正する何かを満たすことができ、

あなたのpom.xmlを投稿するには、ドキュメントからspring-boot共通プロパティファイルのjson応答を確認してください。また、pom.xmlにJacksonのバインドエラーの除外を追加しました。 –

+0

pom.xmlを追加しました。ご協力ありがとうございました。 – kbysiec

答えて

1

これは例

@ManyToMany(mappedBy = "accounts") 
    @JsonIgnore 
    private List<Project> projects; 
関連する問題