RecordCreatorWithAnySetterTest.java
package com.fasterxml.jackson.databind.records;
import java.util.Map;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import static org.junit.jupiter.api.Assertions.assertEquals;
// [databind#562] Allow @JsonAnySetter on Creator constructors
// [databind#3439] Java Record @JsonAnySetter value is null after deserialization
public class RecordCreatorWithAnySetterTest
extends DatabindTestUtil
{
record RecordWithAnySetterCtor562(int id,
Map<String, Integer> additionalProperties) {
@JsonCreator
public RecordWithAnySetterCtor562(@JsonProperty("regular") int id,
@JsonAnySetter Map<String, Integer> additionalProperties
) {
this.id = id;
this.additionalProperties = additionalProperties;
}
}
record TestRecord3439(
@JsonProperty String field,
@JsonAnySetter Map<String, Object> anySetter
) {}
/*
/**********************************************************************
/* Test methods, alternate constructors
/**********************************************************************
*/
private final ObjectMapper MAPPER = newJsonMapper();
// [databind#562]
@Test
public void testRecordWithAnySetterCtor() throws Exception
{
// First, only regular property mapped
RecordWithAnySetterCtor562 result = MAPPER.readValue(a2q("{'regular':13}"),
RecordWithAnySetterCtor562.class);
assertEquals(13, result.id);
assertEquals(0, result.additionalProperties.size());
// Then with unknown properties
result = MAPPER.readValue(a2q("{'regular':13, 'unknown':99, 'extra':-1}"),
RecordWithAnySetterCtor562.class);
assertEquals(13, result.id);
assertEquals(Integer.valueOf(99), result.additionalProperties.get("unknown"));
assertEquals(Integer.valueOf(-1), result.additionalProperties.get("extra"));
assertEquals(2, result.additionalProperties.size());
}
// [databind#3439]
@Test
public void testJsonAnySetterOnRecord() throws Exception {
String json = """
{
"field": "value",
"unmapped1": "value1",
"unmapped2": "value2"
}
""";
TestRecord3439 result = MAPPER.readValue(json, TestRecord3439.class);
assertEquals("value", result.field());
assertEquals(Map.of("unmapped1", "value1", "unmapped2", "value2"),
result.anySetter());
}
}