Restriction Java Spring Boot n'accepte que les combinaisons mois-année uniques
P粉676588738
P粉676588738 2023-09-03 10:11:31
0
1
371

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 = random. 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 :

{ "mois": "mars", "année": "2023", "Temps de lecture": "1" } 

Le code fonctionnera car il n'y a pas d'année 2023 dans la liste, mais dès qu'ils essaieront de saisir

{ "mois": "Mai", "année": "2023", "Temps de lecture": "1" } 

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.

RecordController.java

@PostMapping("/{client_id}") ajout d'un enregistrement public (@PathVariable Long client_id, enregistrement @RequestBody Record){ return recordService.add (client_id, record); } 

RecordService.java

public Record add (Long client_id, Record record){ Liste listemois = mois(); Liste 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 ; } 

记录.java

@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 ; } 

RandomGenerateValue 和月年函数

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 mois(){ Liste 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 années(){ Liste yearList = new ArrayList<>(); yearList.add(2020); yearList.add(2021); retourner la liste des années ; }

P粉676588738
P粉676588738

répondre à tous (1)
P粉285587590

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.

YearMonthcours

Java inclut une classe pour ce concept. Il porte bien son nom :YearMonthet se trouve dans le packagejava.time.

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

Ou utilisezMonthénumération pour garantir des valeurs valides.

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

Vous pouvez utiliser地图。使用NavigableMappour conserver les clés dans un ordre trié.

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

Testez si une valeur a été saisie.

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

ISO 8601

À des fins de texte, utilisez le formatISO 8601par défaut : AAAA-MM

La classe

java.timeutilise le format ISO 8601 par défaut lors de l'analyse/génération de texte.

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

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 :

{ "year-month": "2023-03", "readingTime": "1" }
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal
    À propos de nous Clause de non-responsabilité Sitemap
    Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!