Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

@JsonIgnore on Record property ignored if there is getter override #3992

Closed
ennishol opened this issue Jun 17, 2023 · 9 comments
Closed

@JsonIgnore on Record property ignored if there is getter override #3992

ennishol opened this issue Jun 17, 2023 · 9 comments
Labels
Record Issue related to JDK17 java.lang.Record support
Milestone

Comments

@ennishol
Copy link

Describe the bug
With v 2.15.x I run into com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError). The code works with 2.14.2

To Reproduce
Run the unit test below, see comments in the code

package org.acme.json.error;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.Serial;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

class SerializationTest {

    private ObjectMapper objectMapper;

    @BeforeEach
    void setUp() {
        objectMapper = new ObjectMapper();
    }

    @Test
    public void greeting() throws JsonProcessingException {
        var beanWithRecursion = new Recursion();
        beanWithRecursion.add(beanWithRecursion);
        var gr = new GreetingWithTransientRecursion("hello", beanWithRecursion);
        var json = objectMapper.writer().writeValueAsString(gr);
        System.out.println(json);
    }

    @Test
    public void hello() throws JsonProcessingException {
        var beanWithRecursion = new Recursion();
        beanWithRecursion.add(beanWithRecursion);
        var hello = new HelloWithoutTransientRecursion("hello", beanWithRecursion);
        var json = objectMapper.writer().writeValueAsString(hello);
        System.out.println(json);
    }

    @Test
    public void hellorecord() throws JsonProcessingException {
        var beanWithRecursion = new Recursion();
        beanWithRecursion.add(beanWithRecursion);
        var hello = new HelloRecord("hello", beanWithRecursion);
        var json = objectMapper.writer().writeValueAsString(hello);
        System.out.println(json);
    }

    //works fine as the class but not if converted to record
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static class HelloWithoutTransientRecursion implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;
        private final String text;
        @JsonIgnore
        private final Recursion hidden;

        public HelloWithoutTransientRecursion(String text, Recursion hidden) {
            this.text = text;
            this.hidden = hidden;
        }

        public String getText() {
            return text;
        }

        public Recursion getHidden() {
            return hidden;
        }

        @Override
        public String toString() {
            return "GreetingWithTransientRecursion{" +
                    "text='" + text + '\'' +
                    ", hidden='" + hidden + '\'' +
                    '}';
        }
    }

    /**
     * Infinite recursion (StackOverflowError)
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public record HelloRecord(String text, @JsonIgnore Recursion hidden) {

        /**
         * when the method is not overriden it works
         */
        @Override
        public Recursion hidden() {
            return hidden;
        }

    }

    @JsonInclude(JsonInclude.Include.NON_NULL)
    public static final class GreetingWithTransientRecursion implements Serializable {
        @Serial
        private static final long serialVersionUID = 1L;
        private String text;
        @JsonIgnore
        private transient Recursion hidden; //transient keyword causes Infinite recursion (StackOverflowError)

        public GreetingWithTransientRecursion(String text, Recursion hidden) {
            this.text = text;
            this.hidden = hidden;
        }

        public void setText(String text) {
            this.text = text;
        }

        public void setHidden(Recursion hidden) {
            this.hidden = hidden;
        }

        public String getText() {
            return text;
        }

        public Recursion getHidden() {
            return hidden;
        }
    }

    public static class Recursion {
        private final List<Recursion> all = new ArrayList<>();

        void add(Recursion recursion) {
            all.add(recursion);
        }

        public List<Recursion> getAll() {
            return all;
        }
    }
}
@ennishol ennishol added the to-evaluate Issue that has been received but not yet evaluated label Jun 17, 2023
@pjfanning pjfanning changed the title Infinite recursion (StackOverflowError) Infinite recursion (StackOverflowError) serializing a Record Jun 17, 2023
@pjfanning
Copy link
Member

can't you work around it by not doing this?

        /**
         * when the method is not overriden it works
         */
        @Override
        public Recursion hidden() {
            return hidden;
        }

Have you tried add a @JsonIgnore to this if you really need this method?

@ennishol
Copy link
Author

@pjfanning In general I can change the code, but I thought it worth reporting since it has worked before

@cowtowncoder cowtowncoder added the Record Issue related to JDK17 java.lang.Record support label Jun 18, 2023
@cowtowncoder cowtowncoder changed the title Infinite recursion (StackOverflowError) serializing a Record Infinite recursion (StackOverflowError) serializing a Record with cyclic dependency, @JsonIgnore Jun 18, 2023
@cowtowncoder cowtowncoder removed the to-evaluate Issue that has been received but not yet evaluated label Jun 18, 2023
@cowtowncoder
Copy link
Member

cowtowncoder commented Jun 18, 2023

Sounds like a bug indeed if @JsonIgnore behavior is different here: annotations should be merged in a way to make @JsonIgnore work as expected for records as well as POJOs.

I would recommend using work-around @pjfanning suggests in the mean time.

@pjfanning
Copy link
Member

pjfanning commented Jun 18, 2023

Exception looks like:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"]->java.util.ArrayList[0]->com.fasterxml.jackson.databind.failing.RecordDeserialization3992Test$Recursion["all"])

	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:787)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
	at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)
	at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)
	at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772)
	at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
	at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119)
	at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79)
	at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18)
	at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:732)
	at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:772)
....

The Stackoverflow wouldn't happen if FasterXML/jackson-core#1055 is merged (you would get a StreamConstraintsException instead). There is a still the issue of why the JsonIgnore is not working properly.

@yihtserns
Copy link
Contributor

There are 2 issues here?:

  1. Record + @JsonIgnore + overridden accessor method for the ignored property
  2. Non-record + @JsonIgnore + transient field

2nd issue is same as #3948?

@cowtowncoder
Copy link
Member

cowtowncoder commented Jun 19, 2023

Yeah I wonder if we should try to see if transient Fields removal really needs to happen at a later point, so that @JsonIgnore may be contributed.

Although tbh there may be other problems this would cause wrt some users NOT wanting @JsonIgnore to be propagated.

Still, due to existence of MapperFeature.PROPAGATE_TRANSIENT_MARKER I'll only consider (1) to be the issue covered here -- that is, @JsonIgnore should prevent serialization of a field for Records.

@cowtowncoder
Copy link
Member

I think the question of propagation of transient values is key here, covered by #3948; closing this issue.

@cowtowncoder
Copy link
Member

I have proposed fix (#4048) for #3948. Realized I could probably use verification test from here to see if Record handling changed -- I suspect it might not. But will check after merging "other" POJO-related fix.

@cowtowncoder cowtowncoder reopened this Jul 21, 2023
@cowtowncoder
Copy link
Member

Looks @yihtserns is right: case (2) is now resolved (that is, #3948 solved).
I can reproduce the remaining part, (1). Will see if that can be fixed easily.

@cowtowncoder cowtowncoder changed the title Infinite recursion (StackOverflowError) serializing a Record with cyclic dependency, @JsonIgnore @JsonIgnore on Record property ignored if there is getter override Jul 21, 2023
@cowtowncoder cowtowncoder added this to the 2.16.0 milestone Jul 21, 2023
yihtserns added a commit to yihtserns/jackson-databind that referenced this issue Oct 3, 2023
yihtserns added a commit to yihtserns/jackson-databind that referenced this issue Oct 6, 2023
yihtserns added a commit to yihtserns/jackson-databind that referenced this issue Oct 6, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Record Issue related to JDK17 java.lang.Record support
Projects
None yet
Development

No branches or pull requests

4 participants