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();
    }

では、また。通常の作業jsonからcodで何を変更する必要がありますか?

どうも!

4

2 に答える 2

0

以前にそれらを使用したことはありませんが、ジャクソンがそれらをリンクするには、 @JsonManagedReference と @JsonBackReference に同じ値を設定する必要があると思います。あなたの例では、両方の値が同じではありません。

以下のように、両方の注釈を同じ値に変更して、もう一度やり直すことをお勧めします。

@JsonManagedReference("question-answers")

@JsonBackReference("question-answers")

または、値を指定しないでください。この場合、デフォルト値は「defaultReference」です。これを使用しなければならないケースが複数ある場合は、値を指定する必要があると思います。

[アップデート]

ワークスペースで無限ループのケースを再現しました。私が観察したことは、注釈の値はシリアル化中 (Java オブジェクト -> json 文字列) には関係ありませんが、逆シリアル化 (文字列 -> json オブジェクト) では問題になるということです。

@JsonManagedReference、@JsonBackReference アノテーションの異なる値を使用して問題を再現しようとしたところ、シリアル化は正常に機能しましたが、逆シリアル化を試みると、指定された値 (アノテーション値) が見つかりませんでした。

于 2013-09-07T17:44:58.390 に答える