[JAVA] So erstellen Sie einen Validator, der nur die Eingabe in ein Feld zulässt

Einführung

So erweitern Sie die Bean-Validierung: thermometer_face:

Bestätigungsumgebung

Wie erstelle ich Bali-Daten?

Machen Sie zuerst eine Anmerkung

Meist eine Kopie des Codes in Constraint-Komposition: Schweiß:

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}) //Klasse gemacht mit ↓
@Target({TYPE, ANNOTATION_TYPE}) //Nur an Klassen oder Anmerkungen anhängen
@Retention(RUNTIME)
public @interface AllowSingleInput {
  String message() default "{com.neriudon.example.validator.SingleInput.message}";

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

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

  String[] fields(); //Erstellen Sie ein Array

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

Der Punkt ist, die Annotation nur auf die Klasse oder Annotation auszurichten und ein Array von "String" im Feld zu haben. Sie können die Nachricht solide schreiben, aber ich habe in den Eigenschaften "Bitte geben Sie nur einen Text ein" festgelegt.

Machen Sie Bali Daten

Erstellen wir nun eine Klasse, die die eigentliche Eingabeprüfung durchführt. Nun, die Grundlagen sind ein Kopieren und Einfügen von Beispiel: Schweiß:

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(); //Feldnamen abrufen
    message = constraintAnnotation.message();
  }

  @Override
  public boolean isValid(Object value, ConstraintValidatorContext context) {
    BeanWrapper beanWrapper = new BeanWrapperImpl(value);
    //Verfahren, um zu überprüfen, ob ein Feld eingegeben wurde
    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();
      //Nachrichtenausgabe, wenn die Bedingungen nicht erfüllt sind
      context.buildConstraintViolationWithTemplate(message).addPropertyNode(fields[0])
          .addConstraintViolation();
      return false;
    }
  }
}

Ich erhalte den Zielfeldnamen mit "initialize" und überprüfe, ob er nur in einem der Felder mit "isValid" eingegeben wird (vielleicht gibt es eine andere gute Möglichkeit, ihn zu schreiben: frowning2 :).

Wie benutzt man

Kommentieren Sie die Klasse "Form" und legen Sie die Feldnamen für die Eingabe in "Felder" fest.

@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/Setter weglassen
}

Es besteht keine Notwendigkeit, jsp zu ändern.

<!--Extrahieren Sie nur das Formular-->
<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>

Ausführungsergebnis

実行結果

Sie können jetzt eine Fehlermeldung erhalten, wenn Sie mehrere Felder ausfüllen und eine Taste drücken: v :.

Hintergrund zu diesem Beitrag

Als Memo, weil ich diesen Validator für das Projekt brauchte, an dem ich beteiligt war.

Recommended Posts

So erstellen Sie einen Validator, der nur die Eingabe in ein Feld zulässt
So erstellen Sie eine Klasse, die Klasseninformationen erbt
So erstellen Sie eine Methode
[Rails 6] So erstellen Sie mit cocoon einen dynamischen Formular-Eingabebildschirm
So erstellen Sie ein Maven-Repository für 2020
[Swift5] So erstellen Sie einen Begrüßungsbildschirm
[Rails] So erstellen Sie eine Teilvorlage
So erstellen Sie eine bequeme Methode, die Generika und eine funktionale Schnittstelle verwendet
So erstellen Sie überall eine H2-Datenbank
[Rails] So erstellen Sie ein Diagramm mit lazy_high_charts
So erstellen Sie Pagenationen für das "Kaminari" -Array
[Java] Erstellen Sie eine Sammlung mit nur einem Element
[1.] So erstellen Sie ein Spring-MVC-Framework-Projekt
So erstellen Sie einfach ein Pulldown mit Rails
[Rails] So erstellen Sie eine Twitter-Freigabeschaltfläche
So erstellen Sie eine Java-Umgebung in nur 3 Sekunden
So erstellen Sie eine JDBC-URL (Oracle Database, Thin)
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)
So erstellen Sie einen Daten-URI (base64) in Java
So überprüfen Sie standardmäßig nur eine RadioButton-Prüfung (Hinweis)
[Apple-Abonnementangebot] So erstellen Sie eine Signatur für ein Werbeangebot
So erstellen Sie Docker-Compose
So erstellen Sie ein leichtes Container-Image für Java-Apps
So erstellen Sie ein Formular zur Auswahl eines Datums aus dem Kalender
So erstellen Sie ein Platzhalterteil zur Verwendung in der IN-Klausel
Erstellen Sie eine Methode, mit der Zeichen von jedem Ort abgerufen werden können
So erstellen Sie ein Service Builder-Portlet in Liferay 7 / DXP
[ruby] Erstellen eines Programms, das nur auf bestimmte Bedingungen reagiert
So erstellen und starten Sie eine Docker-Datei für Payara Micro
Wie hinterlasse ich einen Kommentar?
So fügen Sie ein Video ein
So erstellen Sie eine JAR-Datei und eine War-Datei mit dem Befehl jar
So implementieren Sie einen Job, der die Java-API in JobScheduler verwendet
So erstellen Sie ein neues Gradle + Java + Jar-Projekt in Intellij 2016.03
So stellen Sie eine App bereit, die ein lokales Glas auf Heroku verweist
So identifizieren Sie den Pfad, auf dem leicht Fehler gemacht werden können
So erstellen Sie einen Webserver auf einer EC2-Instanz von AWS