Search code examples
javajsonjacksonlombokjackson-databind

Immutable Lombok annotated class with Jackson


What is the preferred way to create class that is

  • Immutable
  • Can be serialized/deserialized with Jackson
  • Human-readable and with low level of boilerplate

Preferably, I would have liked something like this to work:

@Data(onConstructor = @__(@JsonCreator))

and then have all fields to be private final. However, this does not even compile (and I'm not sure why). Using

@AllArgsConstructor(onConstructor = @__(@JsonCreator))

will compile but only yields

InvalidDefinitionException: No serializer found for class

Solution

  • add ConstructorProperties:

    • Create a lombok.config file in an appropriate location with the line: lombok.anyConstructor.addConstructorProperties = true
    • Add lombok @Value annotation to your class to make it immutable

    Then serialization and deserialization by Jackson works as expected.

    This method:

    Edit: 2020-08-16

    • Note: Using @Builder with @Value causes this solution to fail. (Thanks to comment from @guilherme-blanco below.) However, if you also add e.g. @AllArgsConstructor it does still work as expected.

    Edit: 2021-08-19

    • Note: When you add or change a lombok.config file the change is not picked up unless you do a rebuild (clean then build). I have been caught out by this a few times.
    • @Jacksonized annotation solution is another method to achieve the desired outcome for the specific classes annotated. However, I personally prefer not to need to remember to annotate every class used for deserialization. Using lombok.config removes this overhead.