親を参照する内部非静的クラスを持つクラスがあります
public static class HighChartSeriesPercents {
private final List<Entry> entries;
private int total;
@JsonIgnore
private transient boolean percentsGenerated;
@JsonIgnore
private final int sortMode;
public HighChartSeriesPercents() {
this(0);
}
public HighChartSeriesPercents(int sortMode) {
this.entries = new ArrayList<>();
this.sortMode = sortMode;
}
public List<Entry> getEntries() {
return Collections.unmodifiableList(entries);
}
public void add(String name, int value) {
total += value;
percentsGenerated = false;
entries.add(new Entry(name, value));
}
@JsonProperty("size")
public int size() {
return entries.size();
}
public void sort() {
Collections.sort(entries);
}
private void calculatePercents() {
for (Entry e : entries) {
e.setPercent((double) e.getPercent() / (double) total);
}
percentsGenerated = true;
}
public class Entry implements Comparable<Entry> {
private final String name;
private final int value;
private double percent;
public Entry(String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
public double getPercent() {
if (!percentsGenerated) {
calculatePercents();
}
return percent;
}
private void setPercent(double percent) {
this.percent = percent;
}
@Override
public int compareTo(Entry o) {
int r;
if (sortMode == 0) {
r = ObjectUtils.compare(name, o.name);
if (r != 0) {
return r;
}
return ObjectUtils.compare(value, o.value);
} else {
r = ObjectUtils.compare(value, o.value);
if (r != 0) {
return r;
}
return ObjectUtils.compare(name, o.name);
}
}
}
}
ジャクソンがこれをシリアル化するたびに、次のようになります。
JSON を書き込めませんでした: 無限再帰 (StackOverflowError) (参照チェーン経由: my.package.HighChartSeriesPercents["entries"]); ネストされた例外は com.fasterxml.jackson.databind.JsonMappingException: 無限再帰 (StackOverflowError) (参照チェーン経由: my.package.HighChartSeriesPercents["entries"]) です。
Entry
final を作成し、参照変数を親に追加してアクセスしようとしました。また@JsonManagedReference
、エントリの親リストと@JsonBackReference
子の親への参照に対して注釈を付けました。