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