【问题标题】:Jackson is returning duplicate rows杰克逊正在返回重复的行
【发布时间】:2017-03-19 18:59:39
【问题描述】:

我正在尝试从这两个实体类返回 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":"",

我的数据库只插入了一行。在我的控制器上,只找到一个问题列表。但无论何时抛出 json 输出,它都会重复很多与上述 json 示例中相同的行。

可能有什么问题?如果您找不到完整的解决方案,您能否建议我以 json 格式重复相同值的原因?

【问题讨论】:

  • 老兄,你怎么能指望有人阅读你未格式化的 json..

标签: java spring hibernate rest jackson


【解决方案1】:

杰克逊在这里陷入了困境。您的Questions 类有一个指向Answers 的链接,而该类又引用了Questions

解决方案

questions 字段或Answers 类中的getter 标记为@JsonIgnored

【讨论】:

    【解决方案2】:

    你可以试试@JsonManagedReference@JsonBackReference注解

    为了让 Jackson 正常工作,关系的两侧之一不应序列化,以避免导致您的 stackoverflow 错误的无限循环。

    @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;
    

    或者

    如果对获取某些实体数据不感兴趣,只需在任一类中使用 @JsonIgnore

    【讨论】:

      猜你喜欢
      • 2020-02-23
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2017-11-30
      • 1970-01-01
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多