2017-03-19 5 views
0

私はこれら2つのエンティティクラスからjsonを返そうとしています。ジャクソンが重複行を返す

Questions.java

@Entity 
public class Questions { 

@Id 
@Column(name = "id") 
private int id; 

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

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

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

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

@Column(name = "maxlength") 
private int maxlength; 

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

@OneToMany(mappedBy = "questions",targetEntity = Answers.class, cascade = CascadeType.ALL) 
private Set<Answers> answers = new HashSet<>(); 

public int getId() { 
    return id; 
} 

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

public String getQuestion() { 
    return question; 
} 

public void setQuestion(String question) { 
    this.question = question; 
} 

public String getType() { 
    return type; 
} 

public void setType(String type) { 
    this.type = type; 
} 

public String getDescription() { 
    return description; 
} 

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

public String getParam() { 
    return param; 
} 

public void setParam(String param) { 
    this.param = param; 
} 

public int getMaxlength() { 
    return maxlength; 
} 

public void setMaxlength(int maxlength) { 
    this.maxlength = maxlength; 
} 

public String getDependency() { 
    return dependency; 
} 

public Set<Answers> getAnswers() { 
    return answers; 
} 

public void setAnswers(Set<Answers> answers) { 
    this.answers = new HashSet<>(answers); 
    for(Answers answers1:answers){ 
     answers1.setQuestions(this); 
    } 
} 

public void setDependency(String dependency) { 
    this.dependency = dependency; 
} 
} 

Answers.java

@Entity 
public class Answers { 

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

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

@Column(name = "ans_value") 
private int ans_value; 

@Column(name = "ans_weightage") 
private int ans_weightage; 

@Column(name = "is_default") 
private int is_default; 

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name = "ques_id", nullable = false) 
private Questions questions; 

public int getId() { 
    return id; 
} 

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

public String getAns_label() { 
    return ans_label; 
} 

public void setAns_label(String ans_label) { 
    this.ans_label = ans_label; 
} 

public int getAns_value() { 
    return ans_value; 
} 

public void setAns_value(int ans_value) { 
    this.ans_value = ans_value; 
} 

public int getAns_weightage() { 
    return ans_weightage; 
} 

public void setAns_weightage(int ans_weightage) { 
    this.ans_weightage = ans_weightage; 
} 

public int getIs_default() { 
    return is_default; 
} 

public void setIs_default(int is_default) { 
    this.is_default = is_default; 
} 

public Questions getQuestions() { 
    return questions; 
} 

public void setQuestions(Questions questions) { 
    this.questions = questions; 
} 
} 

私のコントローラは、次のようになります。私は現在取得しています

SaveApiController

@RequestMapping("/getData") 
public @ResponseBody List<Questions> getData(){ 
    List<Questions> questionss=saveApiServices.getQuestions(); 
    return questionss; 
} 

JSONの結果が繰り返される値の束を持っています。

[{"id":1,"question":"१. व्यक्तिको पुरा नाम थर?", "type":"input_edittext", 
"description":"","param":"smalltext","maxlength":20,"dependency":"", 
"answers": 
[{"id":0,"ans_label":"मुली","ans_value":1,"ans_weightage":0,"is_default":0, 
"questions":{"id":1,"question":"१. व्यक्तिको पुरा नाम थर?", 
"type":"input_edittext","description":"","param":"smalltext","maxlength":20 
,"dependency":"","answers":[{"id":0,"ans_label":"मुली","ans_value":1, 
"ans_weightage":0,"is_default":0,"questions":{"id":1, 
"question":"१. व्यक्तिको पुरा नाम थर ?","type":"input_edittext", 
"description":"","param":"smalltext","maxlength":20,"dependency":"", 
"answers":[{"id":0,"ans_label":"मुली", 
"ans_value":1,"ans_weightage":0,"is_default":0,"questions":{"id":1, 
"question":"१. व्यक्तिको पुरा नाम थर ?","type":"input_edittext", 
"description":"","param":"smalltext","maxlength":20,"dependency":"", 

データベースには1行しか挿入されていません。私のコントローラには質問のリストが1つしかありません。 jsonの出力がスローされるたびに、上記のjsonサンプルのように多くの同じ行が繰り返されます。

何が問題なのですか?完全な解決策が見つからない場合は、json形式で同じ値を重複している理由を教えてください。

+0

男、のいずれかに@JsonIgnoreを使用.. – Jaiwo99

答えて

0

ジャクソンはここでループしています。 QuestionsクラスにはAnswersへのリンクがあり、そのクラスはQuestionsを参照しています。

ソリューション

マークquestionsフィールドまたは@JsonIgnoredなどAnswersクラスのゲッター。ジャクソンがうまく機能するためにあなたが@JsonManagedReference@JsonBackReference注釈

を試すことができます

0

、関係の両側の一つは、あなたのstackoverflowのエラーが発生infiteループを避けるために、シリアル化されるべきではありません。

@OneToMany(mappedBy = "questions",targetEntity = Answers.class, cascade = CascadeType.ALL) 
@JsonManagedReference 
private Set<Answers> answers = new HashSet<>(); 

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name = "ques_id", nullable = false) 
@JsonBackReference 
private Questions questions; 

それとも

いくつかのエンティティデータを得ることに興味を持っていない場合は、単にあなたが誰かがあなたのunformated JSONを読んで期待できるかクラス

関連する問題