制限 Java Spring Boot は、一意の月と年の組み合わせのみを受け入れます
P粉676588738
2023-09-03 10:11:31
<p>Java Spring Boot で月と年の組み合わせのみの入力を許可する方法。ユーザー (Postman クライアント) が今年の各月のレコード (ランダムに生成された値) を入力できることを確認する必要があります。例: 月: 2 月 -> 年: 2020 -> generatedValue = <em>random</em>。ユーザーが再び 2020 年 2 月に入ると、例外がスローされます。年と月を別々のリストに保存して、その年の月がデータベースにすでに存在するかどうかを確認しようとしましたが、役に立ちませんでした。まず、ユーザーが入力した現在の年がないかどうかを確認する場合は、RecordService 内で行います。たとえば、2021 年がない場合、月と年の組み合わせを確認できるように、「if」でその年をリストに追加する必要があります。それは機能しますが、まだ入力されていない年を入力しない限り(たとえば、2020、2021、2022はありますが、2023はありません)、2番目のifは常にRuntimeException()をスローするため、必要なものではありません。追加する場合: </p>
<pre class="brush:php;toolbar:false;">{
「月」: 「3 月」、
「年」: 「2023」、
"読書時間": "1"
}</pre>
<p>リストには 2023 年がないため、コードは機能しますが、入力しようとするとすぐに </p>
<pre class="brush:php;toolbar:false;">{
「月」: 「5月」、
「年」: 「2023」、
"読書時間": "1"
}</pre>
<p>データベースに 2023 年 5 月の組み合わせがないため機能するはずですが、年がすでに存在しているため機能しません。ブール値を使用して組み合わせが存在するかどうかを確認しようとしましたが、それは私にとって意味がありません。だから助けてください:)
これが私のコードです。</p>
<p>RecordController.java</p>
<pre class="brush:php;toolbar:false;">@PostMapping("/{client_id}")
public Record add(@PathVariable Long client_id, @RequestBody Record レコード){
return recordService.add(client_id, レコード);
}</pre>
<p>RecordService.java</p>
<pre class="brush:php;toolbar:false;">public Record add(Long client_id, Record Record){
リスト<文字列> monthList = months();
リスト<整数> yearList = 年();
レコード RecordSave = 新しい Record();
RecordSave.setId(client_id);
RecordSave.set Year(record.get Year());
RecordSave.setMonth(record.getMonth());
RecordSave.setReadingTime(record.getReadingTime());
RecordSave.setReadingValue(randomGenerate());
//動作しません
if (!yearList.contains(recordSave.get Year())){
yearList.add(recordSave.get Year());
}
//動作しません
if (monthList.contains(recordSave.getMonth()) && yearList.contains(recordSave.get Year())){
新しい RuntimeException() をスローします。
}
それ以外 {
RecordRepository.save(recordSave);
}
null を返します。
}</pre>
<p>记录.java</p>
<pre class="brush:php;toolbar:false;">@Data
@実在物
@Table(名前 = "レコード")
@JsonIgnoreProperties({"hibernateLazyInitializer","ハンドラー","デバイス"})
public class Record は Serializable {を実装します
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
プライベートロングID;
文字列の月。
整数の年。
文字列読み取り時間;
浮動小数点読み取り値;
ブール値は存在します。
}</pre>
<p>RandomGenerateValue 和月年関数数</p>
<pre class="brush:php;toolbar:false;">public Float randomGenerate(){
int 最大 = 105、最小 = 14;
float random_float = (float)Math.floor(Math.random()*(max-min 1) min);
ランダムフロートを返します;
}
パブリック リスト月(){
リスト<文字列> 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 月");
monthList を返します。
}
public List<整数>年(){
リスト<整数> yearList = 新しい ArrayList<>();
yearList.add(2020);
yearList.add(2021);
yearList を返します。
}</pre></p>
年と月を単一の値として保持します
あなたの問題は、年と月を別の値として扱うことに起因しているようです。代わりに、それらを組み合わせてください。年と月の単位で考えてください。
年月
クラスJava には、この概念のクラスが含まれています。これは、
リーリーYearMonth
という適切な名前が付けられており、java.time パッケージ内にあります。または、
リーリーMonth
列挙を使用して、有効な値を確認します。
リーリーマップ
を使用できます。NavigableMap
を使用して、キーを並べ替えられた順序に保ちます。値が入力されているかどうかをテストします。
リーリーISO 8601
テキスト目的の場合は、デフォルトの ISO 8601 形式を使用します: YYYY-MM
java.time クラスは、テキストの解析/生成時にデフォルトで ISO 8601 形式を使用します。
リーリーデータベースが年と月のデータ型を提供しないと仮定すると、そのような文字列をデータベースに格納するために使用できます。このデータ型を提供するデータベースを私は知りません。だから言葉だけで十分なんです。
アルファベット順に並べ替えると、値も時系列に並べ替えられることに注意してください。
JSON は次のようになります:
リーリー