Restriction Java Spring Boot n'accepte que les combinaisons mois-année uniques
P粉676588738
2023-09-03 10:11:31
<p>Comment autoriser la saisie de combinaisons mois-année uniquement dans Java Spring Boot. Je dois m'assurer que l'utilisateur (client Postman) peut saisir un enregistrement (valeur générée aléatoirement) pour chaque mois de l'année en cours. Par exemple : mois : février -> année : 2020 -> valeur générée = <em>random</em>. Lorsque l'utilisateur entre à nouveau en février 2020, il lève une exception. J'ai essayé de stocker l'année et le mois dans des listes séparées pour vérifier si le mois de cette année existe déjà dans la base de données, mais en vain. D'abord dans le RecordService si je veux voir s'il n'y a pas d'année en cours saisie par l'utilisateur. Par exemple, s'il n'y a pas d'année 2021, alors le « si » doit ajouter cette année à la liste afin que je puisse vérifier la combinaison mois-année. Cela fonctionne, mais pas ce dont j'ai besoin, car le second renvoie toujours une RuntimeException() à moins que je n'entre une année qui n'a pas encore été saisie (par exemple, il y a 2020, 2021 et 2022, mais pas 2023), donc lorsque l'utilisateur Lors de l'ajout : </p>
<pre class="brush:php;toolbar:false;">{
"mois": "mars",
"année": "2023",
"Temps de lecture": "1"
}</pré>
<p>Le code fonctionnera car il n'y a pas d'année 2023 dans la liste, mais dès qu'ils essaieront de saisir </p>
<pre class="brush:php;toolbar:false;">{
"mois": "Mai",
"année": "2023",
"Temps de lecture": "1"
}</pré>
<p>Cela ne fonctionnera pas car l'année existe déjà, même si cela devrait fonctionner car il n'y a pas de combinaison pour mai 2023 dans la base de données. J'ai essayé d'utiliser un booléen pour vérifier si la combinaison existe mais cela n'a aucun sens pour moi. Alors s'il vous plaît, aidez-moi :)
Voici mon code.</p>
<p>RecordController.java</p>
<pre class="brush:php;toolbar:false;">@PostMapping("/{client_id}")
ajout d'un enregistrement public (@PathVariable Long client_id, enregistrement @RequestBody Record){
return recordService.add (client_id, record);
}</pré>
<p>RecordService.java</p>
<pre class="brush:php;toolbar:false;">public Record add (Long client_id, Record record){
Liste<Chaîne> listemois = mois();
Liste<Entier> listeannée = années();
Enregistrement recordSave = new Record();
recordSave.setId(client_id);
recordSave.setYear(record.getYear());
recordSave.setMonth(record.getMonth());
recordSave.setReadingTime(record.getReadingTime());
recordSave.setReadingValue(randomGenerate());
//Ne marche pas
if (!yearList.contains(recordSave.getYear())){
yearList.add(recordSave.getYear());
}
//Ne marche pas
if (monthList.contains(recordSave.getMonth()) && yearList.contains(recordSave.getYear())){
lancer une nouvelle RuntimeException();
}
autre {
recordRepository.save(recordSave);
}
renvoie null ;
}</pré>
<p>记录.java</p>
<pre class="brush:php;toolbar:false;">@Data
@Entité
@Table(nom = "enregistrement")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler", "device"})
classe publique Record implémente Serialisable {
@Identifiant
@GeneratedValue (stratégie = GenerationType.IDENTITY)
identifiant long privé ;
Mois de chaîne ;
Année entière ;
Lecture de chaîneTime ;
Valeur de lecture flottante ;
booléen estPrésent ;
}</pré>
<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);
renvoie random_float ;
}
liste publique<String> mois(){
Liste<Chaîne> MonthList = new ArrayList<>();
MonthList.add("Janvier"); MonthList.add("Février"); MonthList.add("Mars"); MonthList.add("Avril");
MonthList.add("Mai"); MonthList.add("Juin"); MonthList.add("Juillet"); MonthList.add("Août");
MonthList.add("Septembre"); MonthList.add("Octobre"); MonthList.add("Novembre"); MonthList.add("Décembre");
retourner la liste des mois ;
}Liste publique<Entier> années(){
Liste<Entier> yearList = new ArrayList<>();
yearList.add(2020);
yearList.add(2021);
retourner la liste des années ;
}</pre></p>
Gardez l'année et le mois ensemble comme une seule valeur
Votre problème semble provenir du traitement de l'année et du mois comme des valeurs distinctes. Combinez-les plutôt. Pensez en termes d'années et de mois.
YearMonth
coursJava inclut une classe pour ce concept. Il porte bien son nom :
YearMonth
et se trouve dans le package java.time.Ou utilisez
Month
énumération pour garantir des valeurs valides.Vous pouvez utiliser
地图
。使用NavigableMap
pour conserver les clés dans un ordre trié.Testez si une valeur a été saisie.
ISO 8601
À des fins de texte, utilisez le format ISO 8601 par défaut : AAAA-MM
La classejava.time utilise le format ISO 8601 par défaut lors de l'analyse/génération de texte.
En supposant que votre base de données ne fournit pas de type de données année et mois, une telle chaîne peut être utilisée pour stocker dans votre base de données. Je ne connais aucune base de données fournissant ce type de données. Les mots suffisent donc.
Veuillez noter que lors du tri alphabétique, les valeurs seront également triées par ordre chronologique.
Votre JSON ressemblera à ceci :