Comment étendre la validation du haricot: thermometer_face:
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.
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 :).
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>
Vous pouvez maintenant recevoir un message d'erreur lorsque vous remplissez plusieurs champs et appuyez sur un bouton: v:.
Comme mémo car j'avais besoin de ce validateur pour le projet dans lequel j'étais impliqué.
Recommended Posts