Lombok: Kode dengan anotasi @Builder gagal dikompilasi di Java 9 (berfungsi di Java 8)

Dibuat pada 7 Agu 2018  ·  3Komentar  ·  Sumber: projectlombok/lombok

Menggunakan Lombok 1.18.2. Kelas berikut dikompilasi dengan Java 8 tetapi tidak dengan 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());
    }
}

Berikut ini adalah output kesalahan:

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

Jika baris DateTimeFormatter.ofPattern("yyyyMMdd") diubah menjadi DateTimeFormatter.BASIC_ISO_DATE , maka kode dikompilasi dengan baik (meskipun kedua metode mengembalikan tipe yang sama).

Saya melampirkan proyek gradle minimal yang hanya mengkompilasi file ini. Gunakan gradle build untuk melihat kesalahan.

lombok-test.zip

Komentar yang paling membantu

Saya memiliki masalah serupa, saat menggunakan @JsonCreator dan @JsonProperty pada konstruktor bersama dengan anotasi @Builder ,
Urutan nama bidang dalam konstruktor yang dianotasi dengan @JsonProperty harus sama dengan yang dideklarasikan di kelas, tidak yakin apakah masalah Anda terkait

<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;
    }
}

Semua 3 komentar

Saya tidak tahu apa yang menyebabkan masalah ini. Saya bisa mereproduksinya.

Saran saya adalah memodifikasi kode Anda dan menetapkan formatter ke variabel lokal (atau bidang akhir statis). Itu menangani contoh masalah ini.

Saya menutup masalah ini, meskipun ada bug yang tidak diketahui yang mendasarinya. Berdasarkan pengalaman kami mengejar bug serupa, ini bisa memakan waktu berminggu-minggu untuk ditemukan, dan ini bukan kasus penggunaan yang umum.

Mengapa kami menutup masalah ini?

Saya memiliki masalah serupa, saat menggunakan @JsonCreator dan @JsonProperty pada konstruktor bersama dengan anotasi @Builder ,
Urutan nama bidang dalam konstruktor yang dianotasi dengan @JsonProperty harus sama dengan yang dideklarasikan di kelas, tidak yakin apakah masalah Anda terkait

<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;
    }
}

Dapat mengonfirmasi cara @blackuprise untuk mereproduksinya dan solusinya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

rspilker picture rspilker  ·  3Komentar

manuel-hegner picture manuel-hegner  ·  4Komentar

delverdev picture delverdev  ·  3Komentar

Bryksin picture Bryksin  ·  3Komentar

x9nico picture x9nico  ·  3Komentar