Java 请求协助解决com.fasterxml.jackson.databind.JsonMappingException:无限递归

Java 请求协助解决com.fasterxml.jackson.databind.JsonMappingException:无限递归,java,json,jackson,Java,Json,Jackson,我有一个类,它有一个引用父类的内部非静态类 public static class HighChartSeriesPercents { private final List<Entry> entries; private int total; @JsonIgnore private transient boolean percentsGenerated; @JsonIgnore private final int sortMode;

我有一个类,它有一个引用父类的内部非静态类

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);
            }
        }

    }

}
公共静态类HighChartSeriesPercents{
私人最终名单条目;
私人整数合计;
@杰索尼奥雷
生成私有瞬态布尔百分比;
@杰索尼奥雷
私有最终int-sortMode;
公共高级图表服务百分比(){
这(0);
}
公共HighChartSeriesPercents(国际排序模式){
this.entries=new ArrayList();
this.sortMode=sortMode;
}
公共列表getEntries(){
返回集合。不可修改列表(条目);
}
公共void add(字符串名称,int值){
总+=价值;
生成的百分比=假;
条目。添加(新条目(名称、值));
}
@JsonProperty(“大小”)
公共整数大小(){
返回条目。size();
}
公共无效排序(){
集合。排序(条目);
}
私有无效计算百分比(){
对于(条目e:条目){
e、 setPercent((双倍)即getPercent()/(双倍)总计);
}
生成的百分比=真;
}
公共类条目实现了可比性{
私有最终字符串名;
私有最终整数值;
私人股本增加一倍;
公共条目(字符串名称、int值){
this.name=名称;
这个值=值;
}
公共字符串getName(){
返回名称;
}
public int getValue(){
返回值;
}
公共双百分比(){
如果(!生成百分比){
计算百分比();
}
收益率;
}
专用无效设置百分比(双倍百分比){
这个百分比=百分比;
}
@凌驾
公共整数比较(条目o){
INTR;
if(sortMode==0){
r=ObjectUtils.compare(name,o.name);
如果(r!=0){
返回r;
}
返回ObjectUtils.compare(值,o.value);
}否则{
r=ObjectUtils.compare(值,o.value);
如果(r!=0){
返回r;
}
返回ObjectUtils.compare(name,o.name);
}
}
}
}
每当Jackson连续发表这篇文章时,我都会得到:

无法写入JSON:Infinite递归(StackOverflowError)(通过 参考链: my.package.HighChartSeriesPercents[“条目]);嵌套 异常为com.fasterxml.jackson.databind.JsonMappingException: 无限递归(StackOverflowError)(通过引用链: my.package.HighChartSeriesPercents[“条目”])


我尝试将
条目设置为final,并向父项添加一个引用变量并访问它,还使用
@JsonManagedReference
注释父项列表,并使用
@JsonBackReference
注释子项对父项的引用。

如上述注释所述,张贴的代码很容易导致堆栈溢出错误

  • Entry#getPercent()
  • 调用
    HighChartSeriesPercents\calculatePercents
  • 调用
    Entry#getPercent()
  • 所以这个问题与杰克逊无关


    如果将逻辑更改为在
    calculatePercents()
    中使用
    value
    ,这将避免。

    如上所述,所发布的代码很容易导致
    堆栈溢出错误

  • Entry#getPercent()
  • 调用
    HighChartSeriesPercents\calculatePercents
  • 调用
    Entry#getPercent()
  • 所以这个问题与杰克逊无关


    如果您将逻辑更改为在
    calculatePercents()
    中使用
    value
    ,这将被避免。

    您是否尝试过在带有一个或多个
    条目的
    HighChartSeriePercents
    实例上调用
    calculatePercents()
    ?你会得到一个SO错误,这与之前评论中的JacksonAgreed无关;看起来有一个非常明显的可能性,就是在
    Entry.getPercent()
    calculatePercents()
    -@milkPlusvelocet你应该把它作为一个答案发布。如果Jackson在序列化过程中调用
    Entry.getPercent()
    来获取字段值,那么您的代码似乎很容易导致SO。啊,该死的,谢谢大家,
    calculatePercents()
    应该是
    e.value
    而不是
    e.getPercent()
    。谢谢milk,你能发布一个答案吗?我会接受的,请随意将其作为代码错误和更正发布。你是否尝试过在带有一个或多个
    条目的
    HighChartSeriesPercents
    实例上调用
    calculatePercents()
    ?你会得到一个SO错误,这与之前评论中的JacksonAgreed无关;看起来有一个非常明显的可能性,就是在
    Entry.getPercent()
    calculatePercents()
    -@milkPlusvelocet你应该把它作为一个答案发布。如果Jackson在序列化过程中调用
    Entry.getPercent()
    来获取字段值,那么您的代码似乎很容易导致SO。啊,该死的,谢谢大家,
    calculatePercents()
    应该是
    e.value
    而不是
    e.getPercent()
    。谢谢milk,你能发布一个答案吗?我会接受的,请随意发布,作为代码错误和更正。