I have following DTOs:
@Value
public class PracticeResults {
@NotNull
Map<Long, Boolean> wordAnswers;
}
@Value
public class ProfileMetaDto {
@NotEmpty
String name;
@Email
String email;
@Size(min = 5)
String password;
}
@Value
is a Lombok annotation which generates a constructor. Which means that this class doesn't have a no-arg constructor.
I used Spring Boot 1.4.3.RELEASE and ObjectMapper
bean was able to deserialize such object from JSON.
After the upgrade to Spring Boot 2.0.0.M7 I receive following exception:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of PracticeResults (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
Jackson version used in Spring Boot 1.4.3 is 2.8.10
and for Spring Boot 2.0.0.M7 is 2.9.2
.
I've tried to Google this problem but found only solutions with @JsonCreator
or @JsonProperty
.
So, why does it work with Spring Boot 1.4.3 and fails with Spring Boot 2? Is it possible to configure bean to behave the same way as the older version?
Due to breaking changes in Lombok version 1.16.20 you need to set the following property in your
lombok.config
file (if you don't have this file you can create it in your project root):This is described in the Lombok changelog: https://projectlombok.org/changelog.
After that the @Value should be accepted again by Jackson.
You may be interested in following the related GitHub issue here, although it's about
@Data
: https://github.com/rzwitserloot/lombok/issues/1563I have upgraded lombok version to : 'org.projectlombok:lombok:1.18.0' and it worked for me.
One more way to solve this problem. Use Jackson parameter names module, which is included in spring boot 2 by default. After this Jackson can deserialize objects. But it works only if you have more than 1 property in object. In case of single property I receive following error message:
Because of the following:
To handle this case with Lombok I've used following workaround:
I had this issue and the solution that worked for me what creating a default constructor without fields and the problem disappeared.