Lombok: Código com anotação @Builder falha ao compilar em Java 9 (funciona em Java 8)

Criado em 7 ago. 2018  ·  3Comentários  ·  Fonte: projectlombok/lombok

Usando o Lombok 1.18.2. A seguinte classe é compilada com Java 8, mas não com Java 9:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.Optional;

import lombok.Builder;
import lombok.Value;

public class TestLombok {
    <strong i="6">@Value</strong>
    <strong i="7">@Builder</strong>
    static class MyClass {
        private final int dayOfWeek;

        static class MyClassBuilder {
            private Optional<LocalDate> date = Optional.empty();

            MyClassBuilder dayOfWeek(int date) {
                if (!this.date.isPresent()) {
                    this.date = Optional.of(LocalDate.parse(String.valueOf(date),
                                                                   DateTimeFormatter.ofPattern("yyyyMMdd") // doesn't compile
                                                                    // DateTimeFormatter.BASIC_ISO_DATE // compiles
                    ));
                }

                this.dayOfWeek = this.date.get().getDayOfWeek().getValue();
                return this;
            }
        }
    }

    public static void main(String[] args) {
        System.out.println(MyClass.builder().dayOfWeek(20181013).build());
    }
}

A seguir está a saída de erro:

TestLombok.java:11: error: incompatible types: String cannot be converted to DateTimeFormatter
    <strong i="11">@Builder</strong>
    ^

Se a linha DateTimeFormatter.ofPattern("yyyyMMdd") for alterada para DateTimeFormatter.BASIC_ISO_DATE , o código será compilado corretamente (embora ambos os métodos retornem o mesmo tipo).

Estou anexando um projeto gradle mínimo que compila apenas este arquivo. Use gradle build para ver o erro.

lombok-test.zip

Comentários muito úteis

Tive um problema semelhante ao usar @JsonCreator e @JsonProperty no construtor junto com a anotação @Builder ,
A ordem dos nomes dos campos no construtor anotado com @JsonProperty precisa ser a mesma declarada na classe, não tenho certeza se o seu problema está relacionado

<strong i="11">@Getter</strong>
<strong i="12">@ToString</strong>
<strong i="13">@Builder</strong>
<strong i="14">@JsonDeserialize</strong>
<strong i="15">@EqualsAndHashCode</strong>
public class DataClass {

    private final long id;

    private final String name;

    private final String date;

// Order of this constructor parameters needs to be in the same order as declared in class, not sure why?
    <strong i="16">@JsonCreator</strong>
    public ClearingFlowCounts(@JsonProperty("name") String name,
                                   @JsonProperty("id") long id, @JsonProperty("date") String date) {

        this.id = id;
        this.name = name;
        this.date = date;
    }
}

Todos 3 comentários

Não tenho ideia do que causa esse problema. Eu posso reproduzi-lo.

Minha sugestão é modificar seu código e atribuir o formatador a uma variável local (ou um campo final estático). Isso resolve essa instância do problema.

Estou encerrando este problema, embora haja um bug desconhecido subjacente. Com base em nossa experiência em perseguir bugs semelhantes, isso pode levar semanas para ser encontrado, e não é um caso de uso comum.

Por que fechamos este problema

Tive um problema semelhante ao usar @JsonCreator e @JsonProperty no construtor junto com a anotação @Builder ,
A ordem dos nomes dos campos no construtor anotado com @JsonProperty precisa ser a mesma declarada na classe, não tenho certeza se o seu problema está relacionado

<strong i="11">@Getter</strong>
<strong i="12">@ToString</strong>
<strong i="13">@Builder</strong>
<strong i="14">@JsonDeserialize</strong>
<strong i="15">@EqualsAndHashCode</strong>
public class DataClass {

    private final long id;

    private final String name;

    private final String date;

// Order of this constructor parameters needs to be in the same order as declared in class, not sure why?
    <strong i="16">@JsonCreator</strong>
    public ClearingFlowCounts(@JsonProperty("name") String name,
                                   @JsonProperty("id") long id, @JsonProperty("date") String date) {

        this.id = id;
        this.name = name;
        this.date = date;
    }
}

Pode confirmar a maneira de @blackuprise de reproduzi-lo e a solução alternativa.

Esta página foi útil?
0 / 5 - 0 avaliações