web-dev-qa-db-ja.com

サイクル例外につながる直接自己参照

クラスがあります。次のようなもの:

public abstract class ElasticSearchValue<T> {

  private Long txId;
  private Long currentTxId;
  private T previous;

  public Long getTxId() {
    return txId;
  }

  public void setTxId(Long txId) {
    this.txId = txId;
  }

  public Long getCurrentTxId() {
    return currentTxId;
  }

  public void setCurrentTxId(Long currentTxId) {
    this.currentTxId = currentTxId;
  }

  public Object getPrevious() {
    return previous;
  }

  public void setPrevious(T previous) {
    this.previous = previous;
  }

}

上記のクラスを拡張するクラス

public class DailyActivity extends ElasticSearchValue<DailyActivity> {

  Long agentId;
  Date date;
  Long success;

  public Long getAgentId() {
    return agentId;
  }

  public void setAgentId(Long agentId) {
    this.agentId = agentId;
  }

  public Date getDate() {
    return date;
  }

  public void setDate(Date date) {
    this.date = date;
  }

  public Long getSuccess() {
    return success;
  }

  public void setSuccess(Long success) {
    this.success = success;
  }

  @Override
  public String toString() {
    return agentId + "_" + date.toString();
  }

}

今、タイプDailyActivityのオブジェクトがあり、それをJSON文字列に変換しようとすると、次の例外が発生します。

原因:com.fasterxml.jackson.databind.JsonMappingException:循環につながる直接の自己参照(参照チェーンを通じて:com.pr.analysis.DailyActivity ["previous"])

私はグーグルで解決策を探しましたが、私が得る解決策は、私が意図するものではない以前の値にjsonIgnoreを入れるように求めます。誰かが同じ問題に直面しましたか?ありがとう

[〜#〜] edit [〜#〜]クラスにサイクルがあることを知っているので、自己参照を持つクラスを逆シリアル化する方法を尋ねていますか?

16
Global Warrior

この場合、関係に次のように @ JsonManagedReference および @ JsonBackReference で注釈を付ける必要があります。

 @ManyToOne
 @JoinColumn(name = "company_id", referencedColumnName = "id")
 @JsonBackReference
 private Company company 

そして

 @OneToMany(mappedBy="company")
 @JsonManagedReference
 private Set<Employee> employee = new HashSet<Employee>();

良い例があります ここ

14
borjab

自己参照はここにあります:

public class DailyActivity extends ElasticSearchValue<DailyActivity> {

DailyActivityElasticSearchValue<DailyActivity>、それ自体はElasticSearchValue<ElasticSearchValue<DailyActivity>>、そしてこれは無限に続きます...

pdate: 2つのクラスに分割します。 DailyActivityをサブクラス化せずにElasticSearchValueを作成します。

public class DailyActivity {
  // the same content as your class above

次に、次のような別のクラスを作成します。

public class ElacticDailyActivity extends ElasticSearchValue<DailyActivity> {
5
ericbn

SerializationFeatureにはFAIL_ON_SELF_REFERENCESというプロパティがあります。デフォルトはtrueですが、falseに設定してこの種の例外をスキップできます。

    ObjectMapper objectMapper = new ObjectMapper();
    objectMapper.configure(SerializationFeature.FAIL_ON_SELF_REFERENCES, false);

SpringBootを使用している場合は、spring.jackson.serialization.fail-on-self-references=falseapplication.propertiesを追加するだけです。

4
ValerioMC

この例のように@JsonIdentityInfoアノテーションを試してください。詳細はこちら http://wiki.fasterxml.com/JacksonFeatureObjectIdentity

@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class Identifiable
{
    public int value;

    public Identifiable next;
}
2
MFIhsan

コードのどこかにあると思います。 DailyActivityのインスタンスの前のものがそれ自体を指しています。

0
Yiheng Wang