0

親を参照する内部非静的クラスを持つクラスがあります

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"]) です。

Entryfinal を作成し、参照変数を親に追加してアクセスしようとしました。また@JsonManagedReference、エントリの親リストと@JsonBackReference子の親への参照に対して注釈を付けました。

4

1 に答える 1

3

上記のコメントで述べたように、投稿されたコードは簡単にStackOverflowError.

  1. Entry#getPercent()
  2. 通話HighChartSeriesPercents#calculatePercents
  3. 通話Entry#getPercent()など

したがって、問題はジャクソンとは無関係です。

valueこれで使用するロジックを変更するcalculatePercents()と、回避されます。

于 2013-08-09T16:02:41.300 に答える