diff --git a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java index a7da1308725..8d61f103b3e 100644 --- a/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java +++ b/src/main/java/com/fasterxml/jackson/databind/deser/BeanDeserializer.java @@ -467,6 +467,10 @@ protected Object _deserializeUsingPropertyBased(final JsonParser p, final Deseri // regular property? needs buffering SettableBeanProperty prop = _beanProperties.find(propName); if (prop != null) { + if (prop.isIgnorable() && _beanType.isRecordType()) { + handleIgnoredProperty(p, ctxt, handledType(), propName); + continue; + } try { buffer.bufferProperty(prop, _deserializeWithErrorWrapping(p, ctxt, prop)); } catch (UnresolvedForwardReference reference) { diff --git a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java index 7611795a3d9..1050dadb861 100644 --- a/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java +++ b/src/main/java/com/fasterxml/jackson/databind/introspect/POJOPropertiesCollector.java @@ -948,6 +948,12 @@ protected void _removeUnwantedProperties(Map props) } // Otherwise, check ignorals if (prop.anyIgnorals()) { + if (_classDef.getType().isRecordType()) { + prop.removeIgnored(); + _collectIgnorals(prop.getName()); + continue; + } + // first: if one or more ignorals, and no explicit markers, remove the whole thing // 16-May-2022, tatu: NOTE! As per [databind#3357] need to consider // only explicit inclusion by accessors OTHER than ones with ignoral marker diff --git a/src/test-jdk14/java/com/fasterxml/jackson/databind/records/RecordBasicsTest.java b/src/test-jdk14/java/com/fasterxml/jackson/databind/records/RecordBasicsTest.java index d16b9d7e0b1..094de0806c9 100644 --- a/src/test-jdk14/java/com/fasterxml/jackson/databind/records/RecordBasicsTest.java +++ b/src/test-jdk14/java/com/fasterxml/jackson/databind/records/RecordBasicsTest.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonNaming; -import com.fasterxml.jackson.databind.exc.InvalidDefinitionException; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.type.TypeFactory; import com.fasterxml.jackson.databind.util.ClassUtil; @@ -140,26 +139,9 @@ public void testSerializeJsonIgnoreRecord() throws Exception { assertEquals("{\"id\":123}", json); } - /** - * This test-case is just for documentation purpose: - * Because unlike JavaBean where the setter can be ignored, the Record's constructor argument must - * have value. - *

- * You can make a constructor parameter optional by {@link JacksonInject}-ing a value, or by creating an alternative - * JsonCreator.mode=PROPERTIES constructor that excludes the ignored parameter. - * - * @see #testDeserializeConstructorInjectRecord() - * @see RecordCreatorsTest#testDeserializeWithAltCtor() - */ - public void testDeserializeJsonIgnoreRecord_WillFail() throws Exception { - try { - MAPPER.readValue("{\"id\":123,\"name\":\"Bob\"}", RecordWithIgnore.class); - - fail("should not pass"); - } catch (InvalidDefinitionException e) { - verifyException(e, "Argument #1 of constructor"); - verifyException(e, "must have name when multiple-parameter constructor annotated as Creator"); - } + public void testDeserializeJsonIgnoreRecord() throws Exception { + RecordWithIgnore value = MAPPER.readValue("{\"id\":123,\"name\":\"Bob\"}", RecordWithIgnore.class); + assertEquals(new RecordWithIgnore(123, null), value); } public void testSerializeJsonRename() throws Exception {