问题
After updating my project to Spring Boot 1.5.10 Lombok stopped working correctly with Jackson. I mean immutable DTOs creation, when field names in my objects are not same as fields in json request:
@Value
@Builder
public class MyImmutableDto implements Serializable {
@JsonProperty("other-field-1-name")
private final BigDecimal myField1;
@JsonProperty("other-field-2-name")
private final String myField2;
and a lot of fields there...
}
So, after updating Spring Boot to 1.5.10 this code isn't working, and I need to configure lombok like that:
lombok.anyConstructor.addConstructorProperties = true
Does anyone know any other way to create such objects with jackson + lombok without this lombok fix?
Instead of this fix I can use following code: @JsonPOJOBuilder
and @JsonDeserialize(builder = MyDto.MyDtoBuilder.class)
:
@Value
@Builder
@JsonDeserialize(builder = MyDto.MyDtoBuilder.class)
public class MyDto implements Serializable {
// @JsonProperty("other-field-1-name") // not working
private final BigDecimal myField1;
private final String myField2;
private final String myField3;
and a lot of fields there...
@JsonPOJOBuilder(withPrefix = "")
public static final class MyDtoBuilder {
}
}
But it is not working with @JsonProperty("other-field-1-name")
.
Ofc, it can be done by simple @JsonCreator
, but maybe there is some way to use it with lombok using some constructor/jackson annotations?
回答1:
So this is not the exact same case, but this works for my problem. I need the @JsonDeserialize annotation on the builder, putting it there on the builder explicitly solves the problem (at the cost of boilerplate code). At least I don't need to type out the rest of the builder.
@Value
@Builder
@JsonDeserialize(builder = ProductPrice.ProductPriceBuilder.class)
public class ProductPrice {
@JsonSerialize(using = MoneySerializer.class)
@JsonDeserialize(using = MoneyDeserializer.class)
Money price;
Duration rentalLength;
Period recurrence;
@JsonPOJOBuilder(withPrefix = "")
public static class ProductPriceBuilder{
@JsonDeserialize(using = MoneyDeserializer.class)
public ProductPrice.ProductPriceBuilder price(Money price) {
this.price = price;
return this;
}
}
}
回答2:
Considering that this question was asked after Jan 2017, I'm assuming that you may have upgraded your version of Lombok 1.16.20
along with Spring Boot. And still using JDK 8
You can update your version of Spring Boot, but may want to keep your Lombok version at 1.16.18
. This will let you implement your extra customization and deserialization via builder work around. That is, as long as you haven't made use of any new lombok annotations.
There was a good amount of effort in 1.16.20 specifically that addresses breaking changes in JDK 9 which can potentially cause issues moving forward on JDK 8.
1.16.20 @Data object no longer constructable for jackson? < Other individuals who recognized similar issues.
来源:https://stackoverflow.com/questions/48644809/lombok-jackson-immutables