Skip to content

Deserialization fails with ImmutableList in Jackson 2.18.3 #5381

@krritik

Description

@krritik

Jackson 2.18.3 fails to deserialize classes with @Builder (Lombok) and ImmutableList (Guava) fields. This worked in Jackson 2.18.1 but breaks after upgrading to 2.18.3 (via Spring Boot 3.4.0 → 3.4.5).

Error

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 
Cannot construct instance of com.google.common.collect.ImmutableList 
(no Creators, like default constructor, exist)

Code that fails

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = PRIVATE)
class MimirAssertsRelabelRules {
    private ImmutableList<MimirRelabelRuleGroup> asserts;
}

ObjectMapper mapper = new ObjectMapper()
    .registerModule(new GuavaModule());

// This throws InvalidDefinitionException
mapper.readValue(json, MimirAssertsRelabelRules.class);

Workaround that works

Add @JsonCreator to force constructor-based deserialization:

@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor(access = PRIVATE)
class MimirAssertsRelabelRules {
    private ImmutableList<MimirRelabelRuleGroup> asserts;

    @JsonCreator
    public static MimirAssertsRelabelRules fromJson(@JsonProperty("asserts") List<MimirRelabelRuleGroup> asserts) {
        return new MimirAssertsRelabelRules(
            asserts != null ? ImmutableList.copyOf(asserts) : ImmutableList.of()
        );
    }
}

This works because it bypasses the builder pattern and uses constructor-based deserialization.

Question

Can anyone help explain why this changed between 2.18.1 and 2.18.3?

Metadata

Metadata

Assignees

No one assigned

    Labels

    2.18Issues planned at 2.18 or laterlombokIssue (likely) related to use of Lombok

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions