[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.

introduction

salut! C'est la 4ème série à jouer avec Java à partir de zéro. Je viens de le nommer.

Cliquez ici pour les articles jusqu'à la dernière fois ↓

  1. Création d'un environnement STS sur mac
  2. Hello World avec Spring Boot
  3. Créer une application Echo avec Spring Boot

Cette fois, je voudrais ajouter une validation à l'application d'écho que j'ai faite la dernière fois.

もょもと.gif

Actuellement, les chaînes de caractères, les nombres et les caractères dépendants de l'environnement peuvent être entrés dans n'importe quel nombre de caractères, donc si vous envoyez un document fantôme, l'affichage sera corrompu comme indiqué ci-dessous.

スクリーンショット 2020-07-21 0.26.28.png

effrayé. Si Hatena est aligné sur le nom, cela créera une atmosphère inquiétante. Est-ce brouillé? Je n'aime pas le fait que Zero ait franchi la largeur de l'écran.

Donc, cette fois, je vais essayer de valider avec les exigences suivantes, comme le nom d'utilisateur d'un service. En cas d'erreur C'est une image qu'un message d'erreur s'affiche sur le même écran.

--Types de caractères disponibles: alphanumérique demi-largeur uniquement

Le produit fini a la forme suivante. (La couleur d'arrière-plan a été changée en une couleur qui est agréable pour les yeux)

画面収録 2020-07-21 23.39.15.mov.gif

Environnement d'utilisation et version

Implémenter la validation avec des annotations dans la classe de formulaire

Les annotations suivantes ont été ajoutées à la classe de formulaire.

-- @ NotBlank: Vous pouvez vérifier qu'il n'est pas nul ou vide [^ 1] -- @ Size: Vous pouvez spécifier les valeurs minimum et maximum en utilisant l'attribut min ou max. -- @ Pattern: Vous pouvez spécifier la chaîne de caractères du modèle de l'expression régulière avec la valeur d'attribut regexp. Cette fois, j'ai utilisé une expression régulière qui n'autorise que les caractères alphanumériques demi-largeur

[^ 1]: utilisez @NotNull pour ne vérifier que null

EchoForm.java


package com.example.form;

import java.io.Serializable;

import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotBlank;

public class EchoForm implements Serializable {
    private static final long serialVersionUID = 1L;
    @NotBlank
    @Size(min = 4)
    @Pattern(regexp = "[a-zA-Z0-9]*") //Doit être alphanumérique
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Ajouter une branche à la classe de contrôleur en cas d'erreur

Ecrivez uniquement la méthode d'écho modifiée. Il y a deux changements ci-dessous.

EchoController.java


@RequestMapping(value = "echo", method = RequestMethod.POST)
	public String echo(@Validated EchoForm echoForm, BindingResult result, Model model) {
		if (result.hasErrors() ) {
			model.addAttribute("name", echoForm.getName());
			return "index";
		}
		model.addAttribute("name", echoForm.getName());
		return "echo";
	}

Ajouter du texte à index.html en cas d'erreur

Je souhaite afficher le message d'erreur en rouge comme indiqué ci-dessous uniquement lorsqu'une erreur se produit ... Cela peut être fait avec Spring!

スクリーンショット 2020-07-21 23.26.59.png

Puisque nous avons déjà lié l'objet de formulaire la dernière fois, nous pouvons obtenir les informations d'erreur de echoForm et les insérer dans Thymeleaf pour créer du HTML. Le printemps est incroyable. Thymeleaf est incroyable.

Seule la partie du formulaire est décrite. A l'endroit entouré par span, le message d'erreur s'affiche uniquement lorsque l'objet est en erreur [^ 2]. Plus précisément, comme les propriétés de l'objet formulaire sont définies dans l'attribut th: errors, seuls les messages d'erreur pour les propriétés spécifiées sont affichés. S'il y a plusieurs messages d'erreur, «
» est automatiquement entré. Je vous remercie.

[^ 2]: j'ai fait référence à la mise en œuvre de cette page.

index.html


<form th:object="${echoForm}" th:action="@{/echo}" method="POST">
        <div>s'il vous plaît entrez votre nom d'utilisateur</div>
        <div>(4 caractères alphanumériques demi-largeur ou plus)</div>
        <div>
        	<input type="text" th:field="*{name}" /> 
        	<button>j'enverrai</button>
        </div>
        <span th:if="${#fields.hasErrors('name')}" th:errors="*{name}" style="color: red"></span>
</form>

Localisation japonaise des mots d'erreur

En fait, si vous exécutez avec l'implémentation jusqu'à présent, le message d'erreur sera le message par défaut (anglais) de l'annotation, donc l'erreur sera la suivante.

スクリーンショット 2020-07-21 23.52.09.png

Je n'aime pas un peu ça ... Ce qui précède peut encore être transmis avec un message d'erreur à la mode ❤️, mais le numéro de taille n'a pas de sens pour l'utilisateur ... Corrigeons cela à un message d'erreur japonais!

Il semble souhaitable de définir les messages d'erreur Bean Validation par Spring MVC dans le fichier de propriétés. Il semble y avoir plusieurs méthodes, mais j'ai choisi cela car il était facile de comprendre comment créer ValidationMessages.properties directement sous le chemin de classe.

Créez un nouveau ValidationMessages.properties sous ressources.

スクリーンショット 2020-07-22 0.29.58.png

Le contenu est une implémentation simple qui réécrit simplement le message de l'annotation utilisée.

ValidationMessages.properties


org.hibernate.validator.constraints.NotBlank.message=Une entrée est requise.
javax.validation.constraints.Size.message=Doit comporter au moins 4 caractères.
javax.validation.constraints.Pattern.message=Seuls les caractères alphanumériques demi-largeur sont valides.

À propos, lorsque je viens de coller ce qui précède dans ValidationMessages.properties, il est automatiquement devenu comme suit simplement en entrant japonais et en appuyant sur Entrée ... Parce que le bean standard de Spring Boot n'est pas UTF-8, Multibyte Il semble que les personnages soient déformés.

ValidationMessages.properties


org.hibernate.validator.constraints.NotBlank.message=\u5165\u529B\u5FC5\u9808\u3067\u3059\u3002
javax.validation.constraints.Size.message=4\u6587\u5B57\u4EE5\u4E0A\u3067\u306A\u304F\u3066\u306F\u3044\u3051\u307E\u305B\u3093\u3002
javax.validation.constraints.Pattern.message=\u534A\u89D2\u82F1\u6570\u306E\u307F\u6709\u52B9\u3067\u3059\u3002

Comme mentionné dans la section commentaire de Qiita here, probablement parce que je suis également un système Spring 2 et Java 11 ou supérieur, UTF dans les propriétés du fichier Si je le mets à -8, cela a bien fonctionné dans l'application. Cliquez simplement avec le bouton droit sur le fichier> Propriétés> Ressource et changez le codage du fichier texte par défaut en UTF-8.

スクリーンショット 2020-07-22 0.58.50.png

Maintenant, quand j'essaye d'enregistrer le fichier, j'obtiens l'avertissement suivant, mais cela a bien fonctionné avec Save as UTF-8.

スクリーンショット 2020-07-22 0.50.06.png

Vous avez maintenant un message japonais comme celui-ci!

スクリーンショット 2020-07-22 0.41.48.png

en conclusion

Cette fois, j'ai eu un petit problème avec la notation Thymeleaf de la partie d'ajout de texte au moment de l'erreur et la localisation japonaise de ValidationMessages.properties! La méthode introduite cette fois est suspecte s'il s'agit du système Spring 1, veuillez donc la vérifier si nécessaire.

Merci pour la lecture!

Recommended Posts

[Java] Article pour ajouter une validation avec Spring Boot 2.3.1.
Obtenez des résultats de validation avec Spring Boot
Ajouter une validation de bean avec Micronaut (Java)
[Java] Intégration LINE avec Spring Boot
[Introduction à Spring Boot] Vérification de la validation du formulaire
Test de validation de classe de formulaire avec Spring Boot
Ajoutez une botte de printemps et un dégradé à éclipse
Comment utiliser MyBatis2 (iBatis) avec Spring Boot 1.4 (Spring 4)
Comment utiliser h2db intégré avec Spring Boot
Essayez d'implémenter la fonction de connexion avec Spring Boot
Comment ajouter un chemin de classe dans Spring Boot
Validation personnalisée avec Spring
Essayez d'automatiser la migration avec Spring Boot Flyway
Je voulais classer la botte à ressort dans un multi-projet
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Télécharger avec Spring Boot
Paramètres de connexion à MySQL avec Spring Boot + Spring JDBC
[Java] [Spring Boot] Spécifier le profil d'exécution --Spring Boot à partir de NetBeans
Mappez automatiquement DTO aux entités avec l'API Spring Boot
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
[JUnit 5] Ecrivez un test de validation avec Spring Boot! [Test de paramétrage]
Comment démarrer par environnement avec Spring Boot de Maven
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Configuration Java avec Spring MVC
Implémenter GraphQL avec Spring Boot
Java pour jouer avec Function
Démarrez avec Spring Boot
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Introduction à Spring Boot ① ~ DI ~
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Introduction à Spring Boot ② ~ AOP ~
Application Java CICS-Run - (4) Application Spring Boot
Connectez-vous à DB avec Java
Connectez-vous à MySQL 8 avec Java
Utilisation de Mapper avec Java (Spring)
Hello World avec Spring Boot
Premiers pas avec Spring Boot
Introduction à Spring Boot, partie 1
[Java] [Spring] Spring Boot 1.4-> 1.2 Note de rétrogradation
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Modifier le message de validation Spring Boot
[Java / Kotlin] Traitement d'échappement (désinfection) pour HTML5 avec unbescape [Spring Boot]
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
[Java] Déployer l'application Spring Boot sur Azure App Service
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Comment appeler et utiliser l'API en Java (Spring Boot)
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
[Java] Exemple de projet de développement d'applications Web avec Spring Boot
Java pour apprendre avec les ramen [Partie 1]
Créez une application avec Spring Boot 2