Sekatan Java Spring Boot hanya menerima gabungan bulan-tahun yang unik
P粉676588738
2023-09-03 10:11:31
<p>Bagaimana untuk membenarkan kemasukan hanya gabungan bulan tahun dalam Java Spring Boot. Saya perlu memastikan bahawa pengguna (pelanggan Posmen) boleh memasukkan rekod (nilai yang dijana secara rawak) untuk setiap bulan dalam tahun semasa. Contohnya: bulan: Februari -> tahun: 2020 -> generatedValue = <em>random</em>. Apabila pengguna memasuki Februari 2020 sekali lagi, ia memberikan pengecualian. Saya telah cuba menyimpan tahun dan bulan dalam senarai berasingan untuk menyemak sama ada bulan tahun itu sudah wujud dalam pangkalan data, tetapi tidak berjaya. Pertama dalam RecordService jika saya ingin melihat jika tiada tahun semasa yang dimasukkan oleh pengguna. Contohnya, jika tiada tahun 2021, maka "jika" harus menambah tahun itu pada senarai supaya saya boleh menyemak gabungan bulan-tahun. Ia berfungsi, tetapi bukan yang saya perlukan kerana yang kedua jika sentiasa melemparkan RuntimeException() melainkan saya memasuki tahun yang belum dimasukkan lagi (mis. terdapat 2020, 2021 dan 2022, tetapi bukan 2023), jadi apabila pengguna Apabila menambah: </p>
<pre class="brush:php;toolbar:false;">{
"bulan": "Mac",
"tahun": "2023",
"Masa membaca": "1"
}</pre>
<p>Kod akan berfungsi kerana tiada tahun 2023 dalam senarai, tetapi sebaik sahaja mereka cuba memasukkan</p>
<pre class="brush:php;toolbar:false;">{
"bulan": "Mei",
"tahun": "2023",
"Masa membaca": "1"
}</pre>
<p>Ia tidak akan berfungsi kerana tahun itu sudah wujud, walaupun ia sepatutnya berfungsi kerana tiada gabungan untuk Mei 2023 dalam pangkalan data. Saya cuba menggunakan boolean untuk menyemak sama ada gabungan itu wujud tetapi itu tidak masuk akal kepada saya. Jadi tolong bantu :)
Inilah kod saya.</p>
<p>RecordController.java</p>
<pre class="brush:php;toolbar:false;">@PostMapping("/{client_id}")
tambah Rekod awam(@PathVariable Long client_id, @RequestBody Record record){
return recordService.add(client_id, record);
}</pre>
<p>RecordService.java</p>
<pre class="brush:php;toolbar:false;">tambah Rekod awam(ID_pelanggan panjang, Rekod rekod){
Senaraikan<String> monthList = bulan();
Senaraikan<Integer> yearList = tahun();
Rekod rekodSimpan = Rekod baharu();
recordSave.setId(client_id);
recordSave.setYear(record.getYear());
recordSave.setMonth(record.getMonth());
recordSave.setReadingTime(record.getReadingTime());
recordSave.setReadingValue(randomGenerate());
//Tidak berfungsi
jika (!yearList.contains(recordSave.getYear())){
yearList.add(recordSave.getYear());
}
//Tidak berfungsi
if (monthList.contains(recordSave.getMonth()) && yearList.contains(recordSave.getYear())){
buang RuntimeException();
}
lain {
recordRepository.save(recordSave);
}
kembali null;
}</pre>
<p>记录.java</p>
<pre class="brush:php;toolbar:false;">@Data
@Entiti
@Jadual(nama = "rekod")
@JsonIgnoreProperties({"hibernateLazyInitializer","pengendali","peranti"})
Rekod kelas awam melaksanakan Serializable {
@ID
@GeneratedValue(strategi= GenerationType.IDENTITY)
id panjang peribadi;
Bulan rentetan;
tahun integer;
Masa membaca rentetan;
Nilai bacaan terapung;
boolean isPresent;
}</pre>
<p>RandomGenerateValue 和月年函数</p>
<pre class="brush:php;toolbar:false;">public Float randomGenerate(){
int maks = 105, min = 14;
float random_float = (float)Math.floor(Math.random()*(maks-min+1)+min);
kembali random_float;
}
Senarai awam<String> bulan(){
Senaraikan<String> monthList = ArrayList baharu<>();
monthList.add("Januari"); monthList.add("Februari"); monthList.add("Mac"); monthList.add("April");
monthList.add("Mei"); monthList.add("Jun"); monthList.add("Julai"); monthList.add("Ogos");
monthList.add("September"); monthList.add("Oktober"); monthList.add("November"); monthList.add("Disember");
Senarai bulan pulangan;
}Senarai awam<Integer> tahun(){
Senaraikan<Integer> yearList = ArrayList baharu<>();
yearList.add(2020);
yearList.add(2021);
senarai tahun pulangan;
}</pre></p>
Pastikan tahun dan bulan bersama-sama sebagai satu nilai
Masalah anda nampaknya berpunca daripada menganggap tahun dan bulan sebagai nilai yang berasingan. Sebaliknya, gabungkan mereka. Fikirkan dari segi tahun dan bulan.
YearMonth
kelasJava termasuk kelas untuk konsep ini. Ia sesuai dinamakan:
YearMonth
dan terletak dalam pakej java.time.Atau gunakan
Month
penghitungan untuk memastikan nilai yang sah.Anda boleh menggunakan
地图
。使用NavigableMap
untuk memastikan kunci dalam susunan yang disusun.Uji sama ada nilai telah dimasukkan.
ISO 8601
Untuk tujuan teks, gunakan format lalai ISO 8601: YYYY-MM
Kelasjava.time menggunakan format ISO 8601 secara lalai apabila menghuraikan/menjana teks.
Dengan mengandaikan pangkalan data anda tidak menyediakan jenis data tahun dan bulan, rentetan sedemikian boleh digunakan untuk menyimpan dalam pangkalan data anda. Saya tidak tahu mana-mana pangkalan data yang menyediakan jenis data ini. Jadi cukuplah kata-kata.
Sila ambil perhatian bahawa apabila mengisih mengikut abjad, nilai juga akan diisih mengikut kronologi.
JSON anda akan kelihatan seperti ini: