Closed
Description
Reproducer:
record NestedRecord(@JsonProperty("foo")String foo) {
@JsonCreator
public NestedRecord(@JsonProperty("foo") String foo) {
this.foo = foo;
}
}
public static void main(String[] args) throws Throwable {
String json = "{\"foo\":\"bar\"}";
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue(json, NestedRecord.class));
record LocalRecord(@JsonProperty("foo") String foo) {
@JsonCreator
public LocalRecord(@JsonProperty("foo") String foo) {
this.foo = foo;
}
}
System.out.println(mapper.readValue(json, LocalRecord.class));
}
Jackson fails with the following error message:
NestedRecord[foo=bar]
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Cannot deserialize Class test.TestMain$1LocalRecord (of type local/anonymous) as a Bean
at [Source: (String)"{"foo":"bar"}"; line: 1, column: 1]
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:309)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:268)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:491)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:4669)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4478)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3434)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3402)
at test/.test.TestMain.main(TestMain.java:37)
Caused by: java.lang.IllegalArgumentException: Cannot deserialize Class test.TestMain$1LocalRecord (of type local/anonymous) as a Bean
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.isPotentialBeanType(BeanDeserializerFactory.java:883)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:137)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:414)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
at com.fasterxml.jackson.databind@2.11.0/com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
... 8 more
It seems to identify the local record as a local class, which is incorrect according to JLS § 14.3:
... A local record is not a local class.