vincoli Usa personalizzate per il vostro campo. Ad esempio, utilizzerà annotazione @StringField
.
@Target(ElementType.FIELD)
@Constraint(validatedBy = StringFieldValidator.class)
@Retention(RetentionPolicy.RUNTIME)
public @interface StringField {
String message() default "Wrong data of string field";
String messageNotEmpty() default "Field can't be empty";
String messageLength() default "Wrong length of field";
boolean notEmpty() default false;
int min() default 0;
int max() default Integer.MAX_VALUE;
Class<?>[] groups() default {};
Class<?>[] payload() default {};
}
Quindi creare una logica nella classe StringFieldValidator
. Questa classe è implementata da un'interfaccia ConstraintValidator <A extends Annotation, T>
.
public class StringFieldValidator implements ConstraintValidator<StringField, String> {
private Boolean notEmpty;
private Integer min;
private Integer max;
private String messageNotEmpty;
private String messageLength;
@Override
public void initialize(StringField field) {
notEmpty = field.notEmpty();
min = field.min();
max = field.max();
messageNotBlank = field.messageNotEmpty();
messageLength = field.messageLength();
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
context.disableDefaultConstraintViolation();
if (notEmpty && value.isEmpty()) {
context.buildConstraintViolationWithTemplate(messageNotEmpty).addConstraintViolation();
return false;
}
if ((min > 0 || max < Integer.MAX_VALUE) && (value.length() < min || value.length() > max)) {
context.buildConstraintViolationWithTemplate(messageLength).addConstraintViolation();
return false;
}
return true;
}
}
Quindi è possibile utilizzare annotazioni come:
@StringField(notEmpty = true, min = 6, max = 64,
messageNotEmpty = "Field can't be empty",
messageLength = "Field should be 6 to 64 characters size")
E dopo tutto, si avrà solo un messaggio di errore indicato in giusto ordine.
perché? L'utente dovrebbe conoscere tutti i requisiti. – Bozho
yap, ma vorrei solo sapere se è possibile :) – Kevin