搜尋

首頁  >  問答  >  主體

限制 Java Spring Boot 只接受唯一的月年組合

<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>
P粉676588738P粉676588738452 天前490

全部回覆(1)我來回復

  • P粉285587590

    P粉2855875902023-09-04 00:07:58

    將年份和月份保留在一起,作為單一值

    您的問題似乎源於將年份和月份視為單獨的值。相反,將它們結合起來。以年月為單位進行思考。

    YearMonth 類別

    Java 包含一個用於此概念的類別。它的名稱很適合:YearMonth,位於java.time套件中。

    YearMonth ym = YearMonth.of ( 2023 , 3 ) ;

    或使用Month枚舉來確保有效值。

    YearMonth ym = YearMonth.of ( 2023 , Month.MARCH ) ;

    您可以使用 地圖。使用 NavigableMap 使鍵保持排序順序。

    NavigableMap< YearMonth , UUID > map = new TreeMap<>() ;
    map.put( 
        YearMonth.of ( 2023 , Month.MARCH ) , 
        UUID.randomUUID()
    );
    map.put( 
        YearMonth.of ( 2023 , Month.FEBRUARY ) , 
        UUID.randomUUID()
    );

    測試是否已輸入值。

    boolean alreadyPut2023March = map.containsKey( YearMonth.of ( 2023 , Month.MARCH ) ) ;

    ISO 8601

    出於文字目的,請使用預設的 ISO 8601 格式:YYYY-MM

    java.time 類別在解析/產生文字時預設使用 ISO 8601 格式。

    String iso8601Output = YearMonth.of ( 2023 , Month.MARCH ).toString() ;

    假設您的資料庫不提供年月資料類型,這樣的字串可用於儲存在您的資料庫中。我不知道有哪個資料庫提供這種資料類型。所以文字就夠了。

    請注意,當按字母順序排序時,值也會按時間順序排序。

    你的 JSON 看起來像這樣:

    {
        "year-month": "2023-03",
        "readingTime": "1"
    }
    

    回覆
    0
  • 取消回覆