diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index fbe656e9fa..1930be59e8 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -22,6 +22,8 @@ Project: jackson-databind #5192: Record types are broken on Android when using R8 (reported by @HelloOO7) (fix by @pjfanning) +#5197: Add more informative exception for back-references with `record` type + (fix by Joo-Hyuk K) - Generate SBOMs [JSTEP-14] 2.19.1 (13-Jun-2025) diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java index c90bdef271..bf74f6e317 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java @@ -787,6 +787,11 @@ protected void addBackReferenceProperties(DeserializationContext ctxt, } } */ + if (beanDesc.isRecordType()) { + ctxt.reportBadTypeDefinition(beanDesc, + "Cannot add back-reference to a `java.lang.Record` type (property '%s')", + refProp.getName()); + } String refName = refProp.findReferenceName(); builder.addBackReferenceProperty(refName, constructSettableProperty(ctxt, beanDesc, refProp, refProp.getPrimaryType())); diff --git a/src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java new file mode 100644 index 0000000000..74a2d5ff6e --- /dev/null +++ b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java @@ -0,0 +1,40 @@ +package com.fasterxml.jackson.databind.records; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.annotation.JsonBackReference; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; +import com.fasterxml.jackson.databind.testutil.DatabindTestUtil; + +import static org.junit.jupiter.api.Assertions.fail; + +// [databind#5188] JsonManagedReference/JsonBackReference exception for records #5188 +// (cannot workd +public class RecordBackReference5188Test + extends DatabindTestUtil +{ + private final ObjectMapper MAPPER = newJsonMapper(); + + @Test + public void testRecordDeserializationFail() throws Exception { + final String json = "{\"children\":[{}]}"; + + try { + MAPPER.readValue(json, Parent.class); + fail("Should not pass"); + } catch (InvalidDefinitionException e) { + verifyException(e, "Cannot add back-reference to a `java.lang.Record` type"); + verifyException(e, "Invalid type definition for "); + verifyException(e, "(property 'parent')"); + } + } + + record Child(@JsonBackReference Parent parent) {} + + record Parent(@JsonManagedReference List children) {} + +}