<p>如何在 Java Spring Boot 中只允許輸入一個月-一年的組合。我需要確保使用者(郵差客戶端)可以在當年每月輸入一個記錄(隨機產生的值)。例如:月份:二月 -> 年:2020 -> generatedValue = <em>隨機的</em>。當使用者再次輸入 2020 年 2 月時,它會拋出異常。我嘗試將年份和月份儲存在單獨的清單中,以檢查資料庫中是否已存在該年份的月份,但無濟於事。首先在 RecordService 中,如果我想查看是否沒有使用者輸入的當前年份。例如,如果沒有 2021 年,那麼“if”應該將該年份添加到列表中,以便我可以檢查月年組合。它有效,但不是我需要的,因為第二個if 總是拋出RuntimeException() ,除非我輸入尚未輸入的年份(例如有2020 年、2021 年和2022 年,但沒有2023 年) ,因此當用戶添加時:</p>
<pre class="brush:php;toolbar:false;">{
"month": "March",
"year": "2023",
"readingTime": "1"
}</pre>
<p>該程式碼將起作用,因為清單中沒有 2023 年,但只要他們嘗試輸入</p>
<pre class="brush:php;toolbar:false;">{
"month": "May",
"year": "2023",
"readingTime": "1"
}</pre>
<p>它不會工作,因為年份已經存在,即使它應該工作,因為資料庫中沒有 2023 年 5 月的組合。我嘗試使用布林值來檢查組合是否存在,但這對我來說沒有任何意義。所以請大家幫忙:)
這是我的程式碼。</p>
<p>RecordController.java</p>
@PostMapping("/{client_id}")
公共記錄新增(@PathVariable Long client_id,@RequestBody記錄記錄){
return recordService.add(client_id, record);
}</pre>
<p>RecordService.java</p>
公共記錄新增(長client_id,記錄記錄){
列表<字串>月份列表=月份();
列表<整數>年列表=年();
記錄recordSave = new Record();
recordSave.setId(client_id);
recordSave.setYear(record.getYear());
recordSave.setMonth(record.getMonth());
recordSave.setReadingTime(record.getReadingTime());
recordSave.setReadingValue(randomGenerate());
//不起作用
if (!yearList.contains(recordSave.getYear())){
yearList.add(recordSave.getYear());
}
//不起作用
if (monthList.contains(recordSave.getMonth()) &&yearList.contains(recordSave.getYear())){
拋出新的運行時異常();
}
別的 {
recordRepository.save(recordSave);
}
返回空值;
}</pre>
<p>記錄.java</p>
@Data
@實體
@Table(名稱=“記錄”)
@JsonIgnoreProperties({"hibernateLazyInitializer","處理程序","設備"})
公共類別記錄實現可序列化{
@ID
@GenerateValue(策略= GenerationType.IDENTITY)
私人長ID;
字符串月;
整數年份;
字串讀取時間;
浮點數讀數值;
布林值是否存在;
}</pre>
<p>RandomGenerateValue 與月年函數</p>
public Float randomGenerate(){
整數最大值 = 105,最小值 = 14;
float random_float = (float)Math.floor(Math.random()*(max-min 1) min);
傳回隨機浮點數;
}
公共列表月(){
列表<字串> MonthList = new ArrayList<>();
MonthList.add(“一月”); MonthList.add(“二月”); MonthList.add(“三月”); MonthList.add(“四月”);
MonthList.add(“五月”); MonthList.add(“六月”); MonthList.add(“七月”); MonthList.add(“八月”);
MonthList.add(“九月”); MonthList.add(“十月”); MonthList.add(“十一月”); MonthList.add(“十二月”);
返回月份列表;
}
公共列表<整數>年(){
列表<整數> YearList = new ArrayList<>();
年列表.add(2020);
年列表.add(2021);
返回年份列表;
}</pre></p>
將年份和月份保留在一起,作為單一值
您的問題似乎源於將年份和月份視為單獨的值。相反,將它們結合起來。以年月為單位進行思考。
YearMonth
類別Java 包含一個用於此概念的類別。它的名稱很適合:
YearMonth
,位於java.time套件中。或使用
Month
枚舉來確保有效值。您可以使用
地圖
。使用NavigableMap
使鍵保持排序順序。測試是否已輸入值。
ISO 8601
出於文字目的,請使用預設的 ISO 8601 格式:YYYY-MM
java.time 類別在解析/產生文字時預設使用 ISO 8601 格式。
假設您的資料庫不提供年月資料類型,這樣的字串可用於儲存在您的資料庫中。我不知道有哪個資料庫提供這種資料類型。所以文字就夠了。
請注意,當按字母順序排序時,值也會按時間順序排序。
你的 JSON 看起來像這樣: