web-dev-qa-db-fra.com

Lombok + Jackson immuables

Après la mise à jour de mon projet avec Spring Boot 1.5.10 Lombok a cessé de fonctionner correctement avec Jackson. Je parle de la création de DTO immuables, lorsque les noms de champs de mes objets ne correspondent pas à ceux de la requête json:

@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...
}

Ainsi, après la mise à jour de Spring Boot vers la version 1.5.10, ce code ne fonctionne pas et je dois configurer Lombok comme suit:

lombok.anyConstructor.addConstructorProperties = true

Est-ce que quelqu'un connaît un autre moyen de créer de tels objets avec jackson + lombok sans ce correctif de lombok? Au lieu de ce correctif, je peux utiliser le code suivant: @JsonPOJOBuilder et @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 {
    }
}

Mais cela ne fonctionne pas avec @JsonProperty("other-field-1-name"). Ofc, cela peut être fait avec le simple @JsonCreator, mais peut-être qu’il serait possible de l’utiliser avec lombok en utilisant des annotations constructeur/jackson?

15
Rands7

Donc, ce n'est pas exactement le même cas, mais cela fonctionne pour mon problème. J'ai besoin de l'annotation @JsonDeserialize sur le générateur. Le fait de le placer ici sur le générateur résout explicitement le problème (au détriment du code standard). Au moins, je n'ai pas besoin de taper le reste du constructeur. 

@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;
        }  
    }
}
1
simon

Étant donné que cette question a été posée après janvier 2017, je suppose que vous avez peut-être mis à niveau votre version de Lombok 1.16.20along avec Spring Boot. Et toujours en utilisant JDK 8

Vous pouvez mettre à jour votre version de Spring Boot, mais vous pouvez conserver votre version de Lombok à 1.16.18. Cela vous permettra de mettre en œuvre votre personnalisation supplémentaire et votre désérialisation via un travail de générateur. En d’autres termes, tant que vous n’avez pas utilisé de nouvelles annotations de Lombok.

La 1.16.20 comportait pas mal d'efforts visant spécifiquement à remédier aux changements radicaux dans la JDK 9, susceptibles de poser problème à l'avenir de la JDK 8.

1.16.20 L'objet @Data n'est plus constructible pour jackson? <Autres personnes ayant reconnu des problèmes similaires.

0
shinjw