Einschränkung: Java Spring Boot akzeptiert nur eindeutige Monats-Jahres-Kombinationen
P粉676588738
2023-09-03 10:11:31
<p>So erlauben Sie die Eingabe nur von Monats-Jahres-Kombinationen in Java Spring Boot. Ich muss sicherstellen, dass der Benutzer (Postman-Client) für jeden Monat des aktuellen Jahres einen Datensatz (zufällig generierter Wert) eingeben kann. Zum Beispiel: Monat: Februar -> Jahr: 2020 -> genericValue = <em>random</em> Wenn der Benutzer erneut Februar 2020 eingibt, wird eine Ausnahme ausgelöst. Ich habe versucht, das Jahr und den Monat in separaten Listen zu speichern, um zu überprüfen, ob der Monat dieses Jahres bereits in der Datenbank vorhanden ist, aber ohne Erfolg. Zuerst im RecordService, wenn ich sehen möchte, ob vom Benutzer kein aktuelles Jahr eingegeben wurde. Wenn es beispielsweise kein Jahr 2021 gibt, sollte das „Wenn“ dieses Jahr zur Liste hinzufügen, damit ich die Monat-Jahr-Kombination überprüfen kann. Es funktioniert, aber nicht das, was ich brauche, weil das zweite if immer eine RuntimeException() auslöst, es sei denn, ich gebe ein Jahr ein, das noch nicht eingegeben wurde (z. B. gibt es 2020, 2021 und 2022, aber nicht 2023), also wenn der Benutzer Beim Hinzufügen: </p>
<pre class="brush:php;toolbar:false;">{
"Monat": "März",
„Jahr“: „2023“,
"readingTime": "1"
}</pre>
<p>Der Code funktioniert, da in der Liste kein Jahr 2023 enthalten ist, aber sobald versucht wird, </p>
<pre class="brush:php;toolbar:false;">{
"Monat": "Mai",
„Jahr“: „2023“,
"readingTime": "1"
}</pre>
<p>Es wird nicht funktionieren, weil das Jahr bereits existiert, obwohl es funktionieren sollte, weil es in der Datenbank keine Kombination für Mai 2023 gibt. Ich habe versucht, mit einem booleschen Wert zu prüfen, ob die Kombination existiert, aber das ergibt für mich keinen Sinn. Also bitte um Hilfe :)
Hier ist mein Code.</p>
<p>RecordController.java</p>
<pre class="brush:php;toolbar:false;">@PostMapping("/{client_id}")
public Record add(@PathVariable Long client_id, @RequestBody Record record){
return recordService.add(client_id, record);
}</pre>
<p>RecordService.java</p>
<pre class="brush:php;toolbar:false;">public Record add(Long client_id, Record record){
Liste<String> Monatsliste = Monate();
Liste<Integer> yearList = years();
Record recordSave = new Record();
recordSave.setId(client_id);
recordSave.setYear(record.getYear());
recordSave.setMonth(record.getMonth());
recordSave.setReadingTime(record.getReadingTime());
recordSave.setReadingValue(randomGenerate());
//Funktioniert nicht
if (!yearList.contains(recordSave.getYear())){
yearList.add(recordSave.getYear());
}
//Funktioniert nicht
if (monthList.contains(recordSave.getMonth()) && yearList.contains(recordSave.getYear())){
throw new RuntimeException();
}
anders {
recordRepository.save(recordSave);
}
null zurückgeben;
}</pre>
<p>记录.java</p>
<pre class="brush:php;toolbar:false;">@Data
@Juristische Person
@Table(name = "Datensatz")
@JsonIgnoreProperties({"hibernateLazyInitializer","handler","device"})
öffentliche Klasse Record implementiert Serializable {
@Ausweis
@GeneratedValue(strategy= GenerationType.IDENTITY)
private lange ID;
String-Monat;
Ganzzahliges Jahr;
String readingTime;
Float readingValue;
boolean isPresent;
}</pre>
<p>RandomGenerateValue 和月年函数</p>
<pre class="brush:php;toolbar:false;">public Float randomGenerate(){
int max = 105, min = 14;
float random_float = (float)Math.floor(Math.random()*(max-min+1)+min);
return random_float;
}
öffentliche Liste<String> Monate(){
Liste<String> MonthList = new ArrayList<>();
MonthList.add("Januar"); MonthList.add("Februar"); MonthList.add("März"); MonthList.add("April");
MonthList.add("Mai"); MonthList.add("Juni"); MonthList.add("Juli"); MonthList.add("August");
MonthList.add("September"); MonthList.add("Oktober"); MonthList.add("November"); MonthList.add("Dezember");
return Monatsliste;
}öffentliche Liste<Integer> Jahre(){
Liste<Integer> yearList = new ArrayList<>();
yearList.add(2020);
yearList.add(2021);
return yearList;
}</pre></p>
将年份和月份保留在一起,作为单个值
您的问题似乎源于将年份和月份视为单独的值。相反,将它们结合起来。以年月为单位进行思考。
YearMonth
类Java 包含一个用于此概念的类。它的名称很合适:
YearMonth
,位于java.time包中。或者使用
Month
枚举来确保有效值。您可以使用
地图
。使用NavigableMap
使键保持排序顺序。测试是否已输入值。
ISO 8601
出于文本目的,请使用默认的 ISO 8601 格式:YYYY-MM
java.time 类在解析/生成文本时默认使用 ISO 8601 格式。
假设您的数据库不提供年月数据类型,这样的字符串可用于存储在您的数据库中。我不知道有哪个数据库提供这种数据类型。所以文字就足够了。
请注意,当按字母顺序排序时,值也会按时间顺序排序。
你的 JSON 看起来像这样: