So erweitern Sie die Bean-Validierung: thermometer_face:
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.
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 :).
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>
Sie können jetzt eine Fehlermeldung erhalten, wenn Sie mehrere Felder ausfüllen und eine Taste drücken: v :.
Als Memo, weil ich diesen Validator für das Projekt brauchte, an dem ich beteiligt war.
Recommended Posts