クラスがあります。次のようなもの:
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 [〜#〜]クラスにサイクルがあることを知っているので、自己参照を持つクラスを逆シリアル化する方法を尋ねていますか?
この場合、関係に次のように @ JsonManagedReference および @ JsonBackReference で注釈を付ける必要があります。
@ManyToOne
@JoinColumn(name = "company_id", referencedColumnName = "id")
@JsonBackReference
private Company company
そして
@OneToMany(mappedBy="company")
@JsonManagedReference
private Set<Employee> employee = new HashSet<Employee>();
良い例があります ここ
自己参照はここにあります:
public class DailyActivity extends ElasticSearchValue<DailyActivity> {
DailyActivity
はElasticSearchValue<DailyActivity>
、それ自体はElasticSearchValue<ElasticSearchValue<DailyActivity>>
、そしてこれは無限に続きます...
pdate: 2つのクラスに分割します。 DailyActivity
をサブクラス化せずにElasticSearchValue
を作成します。
public class DailyActivity {
// the same content as your class above
次に、次のような別のクラスを作成します。
public class ElacticDailyActivity extends ElasticSearchValue<DailyActivity> {
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=false
にapplication.properties
を追加するだけです。
この例のように@JsonIdentityInfo
アノテーションを試してください。詳細はこちら http://wiki.fasterxml.com/JacksonFeatureObjectIdentity
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class Identifiable
{
public int value;
public Identifiable next;
}
コードのどこかにあると思います。 DailyActivityのインスタンスの前のものがそれ自体を指しています。