Как сделать Lombok комплексное или агрегатное строительство - PullRequest
2 голосов
/ 09 мая 2019

Это кажется очевидным требованием, поэтому я удивлен, что нет доступных примеров, но у меня есть класс с аннотацией сборщика Lombok, который содержит класс, в котором также есть сборщик Lombok, вот так:

@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(value = PropertyNamingStrategy.KebabCaseStrategy.class)
@JsonPropertyOrder({ "priceList", "assetRate", "name", "id", "attributes", "description" })
public class T24Element {
    private T24PriceList priceList;
    private String assetRate;
    private String name;
    private String id;
    @Singular("attribute")
    private List<ReferenceDataItem> attributes;
    private String description;
}

T24PriceList и ReferenceDataItem имеют следующий вид:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class T24PriceList {
    private PricedItem leaseTermPrice;
    private PricedItem assetFee;
    private PricedItem basePrice;
}
@Getter
@Setter
@ToString
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonDeserialize(builder = ReferenceDataItem.ReferenceDataItemBuilder.class)
@JsonNaming(value = PropertyNamingStrategy.KebabCaseStrategy.class)
@JsonPropertyOrder({ "description", "code", "endDate" })
public class ReferenceDataItem {

    private String description;

    private String code;

    /**
     * Rarely used - seems to be only for leasePeriod reference data
     */
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy")
    private LocalDate endDate;

}

Наконец, PricedItem:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PricedItem {
    private String priceType;
    private String matCode;
    private String currencyMnemonic;
    private BigDecimal value;
}

Проблема, с которой я сталкиваюсь, заключается в том, что независимо от того, как я использую конструктор, я никогда не смогу получить аннотированные классы @Builder внутри других классов, построенные как что-то отличное от null. Так, например, если я начну с:

    public static T24Element t24Element = T24Element.builder()
        .priceList(t24PriceList)
        .assetRate("GP")
        .attributes([shortCutKey, coreServiceType, size, sellerPid, leasePeriod, capacity,
                     renewAttribute, dimensions, sellerPid2])
        .id("903551")
        .name("Small Post Office Box")
        .description("Personal mail")
        .build()

    public static T24PriceList t24PriceList = T24PriceList.builder()
        .assetFee(assetFee)
        .basePrice(basePrice)
        .leaseTermPrice(leaseTermPrice)
        .build()

    public static PricedItem leaseTermPrice = PricedItem.builder()
        .priceType("ZPOB")
        .matCode("903551")
        .currencyMnemonic("AUD")
        .value(new BigDecimal("253.92"))
        .build()

    public static PricedItem assetFee = PricedItem.builder()
        .priceType("ZPBF")
        .matCode("903613")
        .currencyMnemonic("AUD")
        .value(new BigDecimal("25"))
        .build()

    public static PricedItem basePrice = PricedItem.builder()
        .priceType("ZPOB")
        .matCode("903551")
        .currencyMnemonic("AUD")
        .value(new BigDecimal("277"))
        .build()

значение t24PriceList будет нулевым. Даже если basePrice сам по себе инициализируется правильно, когда я пытаюсь использовать это значение в:

    public static T24PriceList t24PriceList = T24PriceList.builder()
        .assetFee(assetFee)
        .basePrice(basePrice)
        .leaseTermPrice(leaseTermPrice)
        .build()

это всегда ноль. Похоже, Ломбок не может видеть строителей агрегированных классов. Что мне здесь делать?

Кстати: я понимаю, что использую множество аннотаций, но я пробовал разные комбинации, такие как @Getter и @Setter вместо @Data и т. Д., Чтобы попытаться заставить это работать.

1 Ответ

2 голосов
/ 10 мая 2019

Ваши статические поля не final, что означает, что для них абсолютно законно быть нулем во время инициализации класса.Ваш basePrice фактически равен нулю при построении t24PriceList.

Если вы установите их static final, компилятор должен предупредить вас, если вы используете константу перед ее объявлением.Или просто попробуйте переместить декларацию basePrice до t24PriceList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...