Java Spring Boot에서 월-연도 조합만 입력하도록 허용하는 방법입니다. 사용자(Postman 클라이언트)가 올해의 각 달에 대한 레코드(임의로 생성된 값)를 입력할 수 있는지 확인해야 합니다. 예: 월: 2월 -> 연도: 2020 -> 생성된 값 = random 사용자가 2020년 2월을 다시 입력하면 예외가 발생합니다. 해당 연도의 달이 데이터베이스에 이미 존재하는지 확인하기 위해 연도와 월을 별도의 목록에 저장하려고 시도했지만 아무 소용이 없습니다. 먼저 RecordService에서 사용자가 입력한 현재 연도가 없는지 확인합니다. 예를 들어, 2021년이 없으면 "if"는 월-연도 조합을 확인할 수 있도록 해당 연도를 목록에 추가해야 합니다. 작동하지만 아직 입력되지 않은 연도를 입력하지 않는 한(예: 2020, 2021, 2022는 있지만 2023은 없음) 두 번째 if는 항상 RuntimeException()을 발생시키기 때문에 필요한 것은 아닙니다. 추가할 때:
{ "월": "3월", "연도": "2023", "readingTime": "1" }
목록에 2023년이 없기 때문에 코드가 작동하지만, 2023년을 입력하려고 하면
{ "월": "5월", "연도": "2023", "readingTime": "1" }
데이터베이스에 2023년 5월에 대한 조합이 없기 때문에 작동해야 하지만 연도가 이미 존재하기 때문에 작동하지 않습니다. 조합이 존재하는지 확인하기 위해 부울을 사용해 보았지만 나에게는 아무런 의미가 없습니다. 그러니 도와주세요 :) 여기 내 코드가 있습니다.
RecordController.java
@PostMapping("/{client_id}") 공개 레코드 추가(@PathVariable Long client_id, @RequestBody 레코드 레코드){ return RecordService.add(client_id, 레코드); }
RecordService.java
공개 레코드 추가(Long client_id, 레코드 레코드){ 목록월목록 = 개월(); 목록<정수> yearList = 년(); 레코드 RecordSave = 새 레코드(); 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())){ 새로운 RuntimeException()을 던져라; } 또 다른 { RecordRepository.save(recordSave); } null을 반환; }
记录.java
@Data @실재 @Table(name = "레코드") @JsonIgnoreProperties({"hibernateLazyInitializer","handler","device"}) 공개 클래스 레코드는 직렬화 가능 {을 구현합니다. @ID @GeneratedValue(전략= GenerationType.IDENTITY) 개인 긴 ID; 문자열 월; 정수 연도; 문자열읽기시간; 부동 판독 값; 부울 isPresent; }
RandomGenerateValue 日月年函数
공용 부동 소수점 생성(){ 정수 최대 = 105, 최소 = 14; float random_float = (float)Math.floor(Math.random()*(max-min+1)+min); random_float를 반환합니다. } 공개 목록개월(){ 목록 MonthList = 새로운 ArrayList<>(); MonthList.add("1월"); MonthList.add("2월"); MonthList.add("3월"); MonthList.add("4월"); MonthList.add("5월"); MonthList.add("6월"); MonthList.add("7월"); MonthList.add("8월"); MonthList.add("9월"); MonthList.add("10월"); MonthList.add("11월"); MonthList.add("12월"); 개월 목록을 반환합니다. }공개 목록 연령(){ 목록<정수> yearList = new ArrayList<>(); yearList.add(2020); yearList.add(2021); 연도목록을 반환합니다. }
연도와 월을 단일 값으로 함께 유지
귀하의 문제는 연도와 월을 별도의 값으로 처리하는 데서 발생한 것 같습니다. 대신, 그것들을 결합하십시오. 몇 년과 몇 달을 기준으로 생각해 보세요.
YearMonth
수업Java에는 이 개념에 대한 클래스가 포함되어 있습니다. 적절한 이름은
으아악YearMonth
이며java.time패키지에 있습니다.또는
으아악Month
열거를 사용하여 유효한 값을 확인하세요.
으아악地图
。使用NavigableMap
를 사용하여 키를 정렬된 순서로 유지할 수 있습니다.값이 입력되었는지 테스트합니다.
으아악ISO 8601
텍스트 목적의 경우 기본ISO 8601형식인 YYYY-MM
을 사용하세요.java.time클래스는 텍스트를 구문 분석/생성할 때 기본적으로 ISO 8601 형식을 사용합니다.
으아악데이터베이스가 연도 및 월 데이터 유형을 제공하지 않는다고 가정하면 이러한 문자열을 사용하여 데이터베이스에 저장할 수 있습니다. 이 데이터 유형을 제공하는 데이터베이스를 모릅니다. 그러니 말로는 충분합니다.
알파벳순으로 정렬하면 값도 시간순으로 정렬되니 주의하세요.
JSON은 다음과 같습니다:
으아악