2017-04-06 5 views
0

Spring MVC Rest Controllerを使用して、いくつかのエンティティで簡単なCRUD操作を実行しています。私は@ManyToOneの関係を適切に実装する方法を理解しようとジャクソンと少し苦労しています。 Jacquonが関係の「逆」側を直列化すると、「所有」プロパティは省略されます。 HERESに私のコードを見て:オブジェクトの直列化で@OneToMany関係の逆の部分が省略される

@Entity 
public class Competition { 

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

private String name; 

private String nameInUrl; 

@ManyToOne(cascade = CascadeType.ALL) 
@JsonIdentityReference(alwaysAsId=true) 
@JsonBackReference(value="test") 
private Sport sport; 

public Long getId() { 
    return id; 
} 

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

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getNameInUrl() { 
    return nameInUrl; 
} 

public void setNameInUrl(String nameInUrl) { 
    this.nameInUrl = nameInUrl; 
} 

public Sport getSport() { 
    return sport; 
} 

public void setSport(Sport sport) { 
    this.sport = sport; 
} 
} 

@Entity 
public class Sport { 

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

private String name; 

private String nameInUrl; 
@OneToMany(cascade = CascadeType.ALL, mappedBy="sport") 
@JsonManagedReference(value="test") 
private Set<Competition> competitions = new HashSet<Competition>(); 

public Long getId() { 
    return id; 
} 

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

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getNameInUrl() { 
    return nameInUrl; 
} 

public void setNameInUrl(String nameInUrl) { 
    this.nameInUrl = nameInUrl; 
} 

public Set<Competition> getCompetitions() { 
    return competitions; 
} 

public void setCompetitions(Set<Competition> competitions) { 
    this.competitions = competitions; 
} 
} 
私はその全体が競争エンティティをシリアライズ達成することができますどのようにスポーツのエンティティを省略せずに、お願いしたいと思い

おかげで、デイブ

+0

このオブジェクトをシリアル化しようとしましたか? – ZhenyaM

+0

はい、しました。オブジェクトのjson表現は予想どおりにdeserializeしますが、競技オブジェクトを直列化するとスポーツプロパティは省略されます??? – DMcg

答えて

1

まあ、(私が右理解している場合)this答えによると、直列化で@JsonBackReference@JsonManagedReferenceペアは、JSON、ちょうどIDで店舗全体のオブジェクトを意味しません。しかし、このjsonを逆シリアル化すると、StackOverFlowなしで再帰的な接続が得られます。それで行動が期待された(私は=)。

しかし、あなたは、あなたが@JsonBackReference@JsonManagedReferenceを削除し、Sportクラスにcompetitionsフィールドの@JsonIgnoreを渡す必要があるよりも、JSONオブジェクト全体を渡す必要がありますが、あなたがデシリアライズで再帰的な接続が失われます。

また、Sportの独自のデシリアライザを作成して、再帰を取得することもできます。

私はこれがあなたに役立つことを願っています。

+0

さて、ジャクソンのアノテーションの予想される動作のように見えます。私はそれを理解するためにしばらく時間をかけました。私が最後に行った解決策は、カスタムデシリアライザを実装することでした。正常に動作します。ご協力いただきありがとうございます :) – DMcg

関連する問題