recherche

Maison  >  Questions et réponses  >  le corps du texte

Restriction Java Spring Boot n'accepte que les combinaisons mois-année uniques

<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>
P粉676588738P粉676588738448 Il y a quelques jours486

répondre à tous(1)je répondrai

  • P粉285587590

    P粉2855875902023-09-04 00:07:58

    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 cours

    Java inclut une classe pour ce concept. Il porte bien son nom : YearMonth et se trouve dans le package java.time.

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

    Ou utilisez Monthénumération pour garantir des valeurs valides.

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

    Vous pouvez utiliser 地图。使用 NavigableMap pour 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 format ISO 8601 par défaut : AAAA-MM

    La classe

    java.time utilise 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"
    }
    

    répondre
    0
  • Annulerrépondre