BuilderWithBackRef2686Test.java

package tools.jackson.databind.struct;

import org.junit.jupiter.api.Test;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;

import tools.jackson.databind.*;
import tools.jackson.databind.annotation.JsonDeserialize;
import tools.jackson.databind.annotation.JsonPOJOBuilder;
import tools.jackson.databind.testutil.DatabindTestUtil;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

// [databind#2686]: Back References for Builder-based POJOs
class BuilderWithBackRef2686Test extends DatabindTestUtil
{
    // [databind#2686]
    public static class Container {
        Content forward;

        String containerValue;

        @JsonManagedReference
        public Content getForward() {
            return forward;
        }

        @JsonManagedReference
        public void setForward(Content forward) {
            this.forward = forward;
        }

        public String getContainerValue() {
            return containerValue;
        }

        public void setContainerValue(String containerValue) {
            this.containerValue = containerValue;
        }
    }

    @JsonDeserialize(builder = Content.Builder.class) // Works when removing this, i.e. using the constructor
    public static class Content {
        //         @JsonBackReference
        private Container back;

        private String contentValue;

        public Content(Container back, String contentValue) {
            this.back = back;
            this.contentValue = contentValue;
        }

        public String getContentValue() {
            return contentValue;
        }

        @JsonBackReference
        public Container getBack() {
            return back;
        }

        @JsonPOJOBuilder(withPrefix = "")
        public static class Builder {
            private Container back;
            private String contentValue;

            @JsonBackReference
            Builder back(Container b) {
                this.back = b;
                return this;
            }

            Builder contentValue(String cv) {
                this.contentValue = cv;
                return this;
            }

            Content build() {
                return new Content(back, contentValue);
            }
        }
    }

    private final ObjectMapper MAPPER = newJsonMapper();

    @Test
    void buildWithBackRefs2686() throws Exception {
        Container container = new Container();
        container.containerValue = "containerValue";
        Content content = new Content(container, "contentValue");
        container.forward = content;

        String json = MAPPER.writeValueAsString(container);
        Container result = MAPPER.readValue(json, Container.class);

        assertNotNull(result);
        assertNotNull(result.getForward());
        assertEquals("contentValue", result.getForward().getContentValue());
    }
}