0

jackson 1.9.9 で REST インターフェイスを開発しています。これら2つのクラスがあり、親クラスにはクラスのリストが含まれ、子クラスにはクラスへの参照があります。(下記参照)

それらをjsonにシリアル化できるようにしたいのですが、シリアル化したjsonから同じオブジェクトを逆シリアル化する必要もあります。

私が試したこと:

public class Child {
private Parent parent;
private Integer id;
private Integer baseId;

public Child(Parent parent, int i) {
    this.parent = parent;
    this.id = (i+4) * 33;
    this.baseId = i;
}

public Integer getBaseId() {
    return baseId;
}

public void setBaseId(Integer baseId) {
    this.baseId = baseId;
}

public Integer getId() {
    return id;
}

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

@JsonBackReference("employer-employee")
public Parent getParent() {
    return parent;
}

@JsonBackReference("employer-employee")
public void setParent(Parent parent) {
    this.parent = parent;
}

@Override
public boolean equals(Object obj) {
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final Child other = (Child) obj;
    if (this.parent != other.parent && (this.parent == null || !this.parent.equals(other.parent))) {
        return false;
    }
    if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
        return false;
    }
    if (this.baseId != other.baseId && (this.baseId == null || !this.baseId.equals(other.baseId))) {
        return false;
    }
    return true;
}

@Override
public int hashCode() {
    int hash = 3;
    hash = 97 * hash + (this.parent != null ? this.parent.hashCode() : 0);
    hash = 97 * hash + (this.id != null ? this.id.hashCode() : 0);
    hash = 97 * hash + (this.baseId != null ? this.baseId.hashCode() : 0);
    return hash;
}

}

    public class Parent {
    private Integer id;

    private List<Child> list;

    public Parent(Integer id){
        this.id = id;
        list= new ArrayList<Child>();
        for(int i=0; i<5; ++i){
            list.add(new Child(this, i));
        }
    }

    public Integer getId() {
        return id;
    }

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

     @JsonManagedReference("employer-employee")
    public List<Child> getList() {
        return list;
    }

     @JsonManagedReference("employer-employee")
    public void setList(List<Child> list) {
        this.list= list;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Parent other = (Parent) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if (this.list!= other.list&& (this.list== null || this.list.hashCode() != other.list.hashCode())) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 67 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 67 * hash + (this.list!= null ? this.list.hashCode() : 0);
        return hash;
    }


}

編集: 同等のメソッドが修正されましたが、今後はスタックオーバーフローは発生しません

この記事に従いました: http://wiki.fasterxml.com/JacksonFeatureBiDirReferences

and で、setter と gettes の両方にアノテーションを付けたいかもしれないと言われました。

Parent: new Parent(6); をシリアル化して取得した Json。

{
"id": 6,
"list": [{
    "id": 132,
    "baseId": 0
}, {
    "id": 165,
    "baseId": 1
}, {
    "id": 198,
    "baseId": 2
}, {
    "id": 231,
    "baseId": 3
}, {
    "id": 264,
    "baseId": 4
}]

}

私が得たエラー:

[ソース: org.apache.catalina.connector.CoyoteInputStream@11b314c4; 型 [単純型、クラス servicetest.Parent] に適したコンストラクターが見つかりません: JSON オブジェクトからインスタンス化できません (型情報を追加/有効にする必要がありますか?)] 行: 1、列: 2]

私の質問:
JsonManagedReference と JsonBackReference で私の問題を解決する方法はありますか? カスタムシリアライゼーションを記述せずにこれを解決する方法はありますか (Child クラスの親フィールドを Long としてシリアライズし、デシリアライズするときに、サーバーからそれを見つけてオブジェクトを接続しようとします。これはこれを行う最悪の方法です。考える)

ありがとう

4

1 に答える 1

0

上記のコードの問題は、デフォルトのコンストラクターがないことです。親と子にもデフォルトのコンストラクターを設定します。

親.java:

public class Parent {

    //...

    public Parent(){}

    //...

}

Child.java:

public class Child{

    //...

    public Child(){}

    //....

}
于 2013-06-16T10:05:00.430 に答える