Skip to content

Fail to deserialize local Records #2758

Closed
@DasBrain

Description

@DasBrain

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    JDK11Features that need JDK11 (and/or support JDK11)

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions