[JAVA] Comment créer un validateur qui n'autorise la saisie que dans un seul champ

introduction

Comment étendre la validation du haricot: thermometer_face:

Environnement de confirmation

Comment créer des données de Bali en premier lieu?

Tout d'abord, faites une annotation

Surtout une copie du code dans Constraint composition: sweat:

AllowSingleInput.java


import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Constraint(validatedBy = {AllowSingleInputValidator.class}) //Classe faite avec ↓
@Target({TYPE, ANNOTATION_TYPE}) //Attacher uniquement aux classes ou aux annotations
@Retention(RUNTIME)
public @interface AllowSingleInput {
  String message() default "{com.neriudon.example.validator.SingleInput.message}";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

  String[] fields(); //Faire un tableau

  @Target({TYPE, ANNOTATION_TYPE})
  @Retention(RUNTIME)
  @Documented
  @interface List {
    AllowSingleInput[] value();
  }
}

Le but est de cibler l'annotation uniquement sur la classe ou l'annotation, et d'avoir un tableau de «String» dans le champ. Vous pouvez écrire le message solidement, mais j'ai défini «Veuillez saisir un seul texte déposé» dans les propriétés.

Faire des données de Bali

Maintenant, créons une classe qui effectue la vérification d'entrée réelle. Eh bien, les bases sont une copie de Example: sweat:

AllowSingleInputValidator.java


import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;
import org.springframework.util.StringUtils;

public class AllowSingleInputValidator implements ConstraintValidator<AllowSingleInput, Object> {
  private String[] fields;

  private String message;

  @Override
  public void initialize(AllowSingleInput constraintAnnotation) {
    fields = constraintAnnotation.fields(); //Obtenir le nom du champ
    message = constraintAnnotation.message();
  }

  @Override
  public boolean isValid(Object value, ConstraintValidatorContext context) {
    BeanWrapper beanWrapper = new BeanWrapperImpl(value);
    //Processus pour vérifier si un champ est entré
    boolean isSingleInput = false;
    for (String field : fields) {
      if (!StringUtils.isEmpty(beanWrapper.getPropertyValue(field))) {
        if (isSingleInput) {
          isSingleInput = false;
          break;
        } else {
          isSingleInput = true;
        }
      }
    }

    if (isSingleInput) {
      return true;
    } else {
      context.disableDefaultConstraintViolation();
      //Sortie de message si les conditions ne sont pas remplies
      context.buildConstraintViolationWithTemplate(message).addPropertyNode(fields[0])
          .addConstraintViolation();
      return false;
    }
  }
}

J'obtiens le nom du champ cible avec ʻinitialize et je vérifie s'il est entré dans un seul des champs avec ʻisValid (peut-être y a-t-il un autre bon moyen de l'écrire: frowning2 :).

Comment utiliser

Annotez la classe Form et définissez les noms de champ pour la vérification d'entrée dans les champs`.

@AllowSingleInput(fields = {"todoTitle1", "todoTitle2", "todoTitle3"})
public class TodoForm implements Serializable {

  private static final long serialVersionUID = 1L;

  private String todoTitle1;

  private String todoTitle2;

  private String todoTitle3;

  // getter/omettre setter
}

Il n'est pas nécessaire de changer jsp.

<!--Extraire uniquement le formulaire-->
<form:form action="${pageContext.request.contextPath}/todo/create"
	method="post" modelAttribute="todoForm">
    <form:label path="todoTitle1"/>
    <form:input path="todoTitle1" />
    <form:errors path="todoTitle1" cssClass="text-error" /><br>
    <form:label path="todoTitle2"/>
    <form:input path="todoTitle2" />
    <form:errors path="todoTitle2" cssClass="text-error" /><br>
    <form:label path="todoTitle3"/>
    <form:input path="todoTitle3" />
    <form:errors path="todoTitle3" cssClass="text-error" /><br>
    <form:button>Create Todo</form:button>
</form:form>

Résultat d'exécution

実行結果

Vous pouvez maintenant recevoir un message d'erreur lorsque vous remplissez plusieurs champs et appuyez sur un bouton: v:.

Contexte de cet article

Comme mémo car j'avais besoin de ce validateur pour le projet dans lequel j'étais impliqué.

Recommended Posts

Comment créer un validateur qui n'autorise la saisie que dans un seul champ
Comment créer une classe qui hérite des informations de classe
Comment créer une méthode
[Rails 6] Comment créer un écran de saisie de formulaire dynamique à l'aide de cocoon
Comment créer un référentiel Maven pour 2020
[Swift5] Comment créer un écran de démarrage
[rails] Comment créer un modèle partiel
Comment créer une méthode pratique qui utilise des génériques et une interface fonctionnelle
Comment créer une base de données H2 n'importe où
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
Comment créer des pages pour le tableau "kaminari"
[Java] Créer une collection avec un seul élément
[1st] Comment créer un projet de framework Spring-MVC
Comment créer facilement un pull-down avec des rails
[Rails] Comment créer un bouton de partage Twitter
Comment créer un environnement Java en seulement 3 secondes
Comment créer une URL JDBC (Oracle Database, Thin)
Comment créer un projet Spring Boot dans IntelliJ
[Spring Boot] Comment créer un projet (pour les débutants)
Comment créer un URI de données (base64) en Java
Comment vérifier une seule vérification RadioButton par défaut (Remarque)
[Offre d'abonnement Apple] Comment créer une signature d'offre promotionnelle
Comment créer docker-compose
Comment créer une image de conteneur légère pour les applications Java
Comment créer un formulaire pour sélectionner une date dans le calendrier
Comment créer une partie d'espace réservé à utiliser dans la clause IN
Créez une méthode qui peut récupérer des caractères à partir de n'importe quel emplacement
Comment créer un portlet de générateur de services dans Liferay 7 / DXP
[ruby] Création d'un programme qui ne répond qu'à des conditions spécifiques
Comment créer et lancer un Dockerfile pour Payara Micro
Comment laisser un commentaire
Comment insérer une vidéo
Comment créer un fichier jar et un fichier war à l'aide de la commande jar
Comment implémenter un travail qui utilise l'API Java dans JobScheduler
Comment créer un nouveau projet Gradle + Java + Jar dans Intellij 2016.03
Comment déployer une application qui référence un pot local à heroku
Comment identifier le chemin sur lequel il est facile de se tromper
Comment créer un serveur Web sur une instance EC2 d'AWS