0

我将注释 Jacson 添加到我的实体中,但 json 无限循环的问题没有解决。另一种解决方案是什么?也许添加一些不同的注释。从表中选择并转移到列表没有问题,一切正常。

import org.codehaus.jackson.annotate.JsonManagedReference;

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
@Entity
@Table(name = "Question")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Question implements Serializable{


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

    private String question;


    @JsonManagedReference("question-answers")
    @OneToMany(mappedBy="question")
//  @Transient
    private List<Answer> answers;
// getters and setters
@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Answer implements Serializable{


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

    private String answer;

    private byte isCorrect;

    @ManyToOne(optional = false)
//  @JoinColumn(name="QuestionID")
    @JsonBackReference("question-answer")
    @JsonIgnore
//  @Transient
//  @ManyToOne
    @JoinColumn(name="QuestionID")
    private Question question;

控制器

@RequestMapping("/home")
public @ResponseBody List<Question> home(){
    List<Question> qu = questionService.getQuestions();
    return qu;

我在我的页面上收到了 json 的无限循环。道

public List<Question> getQuestions() {
        // TODO Auto-generated method stub
        return sessionFactory.getCurrentSession().createQuery("from Question").list();
    }

所以,再一次。我必须在我的 cod 中从正常工作 json 更改什么?

谢谢!

4

2 回答 2

0

你可能会被逆转如下:

课堂提问:

从:

@JsonManagedReference("question-answers")
@OneToMany(mappedBy="question")
private List<Answer> answers;

至:

@JsonBackReference("question-answers")
@OneToMany(mappedBy="question")
private List<Answer> answers;

在课堂上回答:

从:

@ManyToOne(optional = false)
@JsonBackReference("question-answer")
@JoinColumn(name="QuestionID")
private Question question;

至:

@ManyToOne(optional = false)
@JsonManagedReference("question-answer")
@JoinColumn(name="QuestionID")
private Question question;
于 2014-02-21T11:18:49.757 回答
0

我以前从未使用过它们,但我想 @JsonManagedReference 和 @JsonBackReference 需要具有相同的值,以便 Jackson 将它们链接在一起。在您的示例中,两者的值不同。

我建议您通过将两个注释更改为具有相同值来重试,如下所示。

@JsonManagedReference("question-answers")

@JsonBackReference("question-answers")

或者不指定任何值。在这种情况下,默认值为“defaultReference”。如果您有不止一种情况必须使用它,那么我猜您被迫指定一个值。

[更新]

我在我的工作区中重现了无限循环案例。我观察到的是,注释中的值在序列化期间无关紧要(java 对象-> json 字符串),但它们在反序列化(字符串-> json 对象)中很重要。

当我尝试使用@JsonManagedReference、@JsonBackReference 注释中的不同值重现问题时,序列化工作正常,但尝试反序列化最终导致抛出异常,指出具有指定值的正确反向引用(注释值) 未找到。

于 2013-09-07T17:44:58.390 回答