From 7d76623acbd72e8d1c754b1985c6c80c5249e7d5 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Tue, 17 Jun 2025 23:38:33 +0900 Subject: [PATCH 1/5] Fix #5188 --- .../deser/BeanDeserializerFactory.java | 4 ++ .../databind/records/Record5188Test.java | 38 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java 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..ee218c08f5 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java @@ -788,6 +788,10 @@ protected void addBackReferenceProperties(DeserializationContext ctxt, } */ String refName = refProp.findReferenceName(); + if (beanDesc.isRecordType()) { + ctxt.reportBadTypeDefinition(beanDesc, "Cannot add back-reference to record type class '%s' (property '%s')", + beanDesc.getBeanClass().getName(), refName); + } builder.addBackReferenceProperty(refName, constructSettableProperty(ctxt, beanDesc, refProp, refProp.getPrimaryType())); } diff --git a/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java new file mode 100644 index 0000000000..9622fe491b --- /dev/null +++ b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java @@ -0,0 +1,38 @@ +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; + +public class Record5188Test + extends DatabindTestUtil +{ + private final ObjectMapper objectMapper = newJsonMapper(); + + @Test + public void testRecordDeserializationFail() throws Exception { + final String json = "{\"children\":[{}]}"; + + try { + objectMapper.readValue(json, Parent.class); + fail("Should not pass"); + } catch (InvalidDefinitionException e) { + verifyException(e, "Cannot add back-reference to record type class"); + verifyException(e, "Invalid type definition for"); + } + } + + + record Child(@JsonBackReference Parent parent) {} + + record Parent(@JsonManagedReference List children) {} + +} From dfea3a0a014f372ff49c273dbede84a7bcab4297 Mon Sep 17 00:00:00 2001 From: "Kim, Joo Hyuk" Date: Tue, 17 Jun 2025 23:39:56 +0900 Subject: [PATCH 2/5] 5188 --- .../com/fasterxml/jackson/databind/records/Record5188Test.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java index 9622fe491b..c30af9042f 100644 --- a/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java +++ b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java @@ -12,6 +12,7 @@ import static org.junit.jupiter.api.Assertions.fail; +// [databind#5188] Should JsonManagedReference/JsonBackReference for records #5188 public class Record5188Test extends DatabindTestUtil { From 4992245564e1b7765e599f5906af7cf727bdfe7c Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Tue, 17 Jun 2025 19:48:24 -0700 Subject: [PATCH 3/5] Add release ntoe --- release-notes/VERSION-2.x | 2 ++ 1 file changed, 2 insertions(+) diff --git a/release-notes/VERSION-2.x b/release-notes/VERSION-2.x index da7650a570..7891afe99c 100644 --- a/release-notes/VERSION-2.x +++ b/release-notes/VERSION-2.x @@ -19,6 +19,8 @@ Project: jackson-databind #5151: Add new exception type, `MissingInjectValueException`, to be used for failed `@JacksonInject` #5179: Add "current token" info into `MismatchedInputException` +#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) From fb677dfcd66fea0e0735718ac14d06fd8b2c52c5 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 18 Jun 2025 08:13:06 -0700 Subject: [PATCH 4/5] Minor renaming, clean up --- .../databind/deser/BeanDeserializerFactory.java | 8 +++++--- ...88Test.java => RecordBackReference5188Test.java} | 13 +++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) rename src/test-jdk17/java/com/fasterxml/jackson/databind/records/{Record5188Test.java => RecordBackReference5188Test.java} (70%) 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 ee218c08f5..8beb50a2a4 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java @@ -787,11 +787,13 @@ protected void addBackReferenceProperties(DeserializationContext ctxt, } } */ - String refName = refProp.findReferenceName(); if (beanDesc.isRecordType()) { - ctxt.reportBadTypeDefinition(beanDesc, "Cannot add back-reference to record type class '%s' (property '%s')", - beanDesc.getBeanClass().getName(), refName); + ctxt.reportBadTypeDefinition(beanDesc, + "Cannot add back-reference to `java.lang.Record` type '%s' (property '%s')", + beanDesc.getBeanClass().getName(), + 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/Record5188Test.java b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java similarity index 70% rename from src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java rename to src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java index c30af9042f..1ecc2808de 100644 --- a/src/test-jdk17/java/com/fasterxml/jackson/databind/records/Record5188Test.java +++ b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java @@ -12,26 +12,27 @@ import static org.junit.jupiter.api.Assertions.fail; -// [databind#5188] Should JsonManagedReference/JsonBackReference for records #5188 -public class Record5188Test +// [databind#5188] JsonManagedReference/JsonBackReference exception for records #5188 +// (cannot workd +public class RecordBackReference5188Test extends DatabindTestUtil { - private final ObjectMapper objectMapper = newJsonMapper(); + private final ObjectMapper MAPPER = newJsonMapper(); @Test public void testRecordDeserializationFail() throws Exception { final String json = "{\"children\":[{}]}"; try { - objectMapper.readValue(json, Parent.class); + MAPPER.readValue(json, Parent.class); fail("Should not pass"); } catch (InvalidDefinitionException e) { - verifyException(e, "Cannot add back-reference to record type class"); + verifyException(e, "Cannot add back-reference to `java.lang.Record` type "); verifyException(e, "Invalid type definition for"); + verifyException(e, "(property 'parent')"); } } - record Child(@JsonBackReference Parent parent) {} record Parent(@JsonManagedReference List children) {} From 63682e73c22e1725e5d3fdfbb364e6c5fe388fbe Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 18 Jun 2025 08:20:00 -0700 Subject: [PATCH 5/5] Minor tweaking --- .../jackson/databind/deser/BeanDeserializerFactory.java | 3 +-- .../jackson/databind/records/RecordBackReference5188Test.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) 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 8beb50a2a4..bf74f6e317 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializerFactory.java @@ -789,8 +789,7 @@ protected void addBackReferenceProperties(DeserializationContext ctxt, */ if (beanDesc.isRecordType()) { ctxt.reportBadTypeDefinition(beanDesc, - "Cannot add back-reference to `java.lang.Record` type '%s' (property '%s')", - beanDesc.getBeanClass().getName(), + "Cannot add back-reference to a `java.lang.Record` type (property '%s')", refProp.getName()); } String refName = refProp.findReferenceName(); 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 index 1ecc2808de..74a2d5ff6e 100644 --- a/src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java +++ b/src/test-jdk17/java/com/fasterxml/jackson/databind/records/RecordBackReference5188Test.java @@ -27,8 +27,8 @@ public void testRecordDeserializationFail() throws Exception { MAPPER.readValue(json, Parent.class); fail("Should not pass"); } catch (InvalidDefinitionException e) { - verifyException(e, "Cannot add back-reference to `java.lang.Record` type "); - verifyException(e, "Invalid type definition for"); + verifyException(e, "Cannot add back-reference to a `java.lang.Record` type"); + verifyException(e, "Invalid type definition for "); verifyException(e, "(property 'parent')"); } }