Sto convalidando due campi, "password" e "confirmPassword" nel modulo per l'uguaglianza utilizzando HibernateValidator
come specificato in this answer. Di seguito è riportato il descrittore di vincoli (interfaccia di convalida).Convalida campi incrociati con HibernateValidator non visualizza messaggi di errore
package constraintdescriptor;
import constraintvalidator.FieldMatchValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.TYPE;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Target;
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@Documented
public @interface FieldMatch
{
String message() default "{constraintdescriptor.fieldmatch}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* @return The first field
*/
String first();
/**
* @return The second field
*/
String second();
/**
* Defines several <code>@FieldMatch</code> annotations on the same element
*
* @see FieldMatch
*/
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Documented
public @interface List{
FieldMatch[] value();
}
}
segue è il validatore vincolo (classe di attuazione).
package constraintvalidator;
import constraintdescriptor.FieldMatch;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.beanutils.BeanUtils;
public final class FieldMatchValidator implements ConstraintValidator<FieldMatch, Object>
{
private String firstFieldName;
private String secondFieldName;
public void initialize(final FieldMatch constraintAnnotation) {
firstFieldName = constraintAnnotation.first();
secondFieldName = constraintAnnotation.second();
//System.out.println("firstFieldName = "+firstFieldName+" secondFieldName = "+secondFieldName);
}
public boolean isValid(final Object value, final ConstraintValidatorContext cvc) {
try {
final Object firstObj = BeanUtils.getProperty(value, firstFieldName);
final Object secondObj = BeanUtils.getProperty(value, secondFieldName);
//System.out.println("firstObj = "+firstObj+" secondObj = "+secondObj);
return firstObj == null && secondObj == null || firstObj != null && firstObj.equals(secondObj);
}
catch (final Exception e) {
System.out.println(e.toString());
}
return true;
}
}
Il seguente è il fagiolo validatore mappato con la pagina JSP (come specificato commandName="tempBean"
con il tag <form:form></form:form>
).
package validatorbeans;
import constraintdescriptor.FieldMatch;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;
@FieldMatch.List({
@FieldMatch(first = "password", second = "confirmPassword", message = "The password fields must match", groups={TempBean.ValidationGroup.class})
})
public final class TempBean
{
@NotEmpty(groups={ValidationGroup.class}, message="Might not be left blank.")
private String password;
@NotEmpty(groups={ValidationGroup.class}, message="Might not be left blank.")
private String confirmPassword;
public interface ValidationGroup {};
//Getters and setters
}
UPDATE
E 'tutto funziona correttamente e che la convalida destinato. Rimane solo una cosa è visualizzare il messaggio di errore specificato sopra la classeall'interno di @FieldMatch
non viene visualizzata la solo una domanda:come visualizzare i messaggi di errore sulla pagina JSP quando si verifica una violazione di convalida?
(l'annotazione @NotEmpty
su entrambi i campi password
e confirmPassword
nelle opere di classe TempBean
e visualizza i messaggi specificati sulla violazione, la cosa non sta accadendo con @FieldMatch
).
sto usando gruppo convalida sulla base di this question come specificato nella this blog e funziona bene causando interruzioni nella visualizzazione dei messaggi di errore (come potrebbe sembrare).
Nella pagina JSP questi due campi sono specificati come segue.
<form:form id="mainForm" name="mainForm" method="post" action="Temp.htm" commandName="tempBean">
<form:password path="password"/>
<font style="color: red"><form:errors path="password"/></font><br/>
<form:password path="confirmPassword"/>
<font style="color: red"><form:errors path="confirmPassword"/></font><br/>
</form:form>
Il motivo per cui la convalida non è stata eseguita è a causa di questa affermazione nella domanda "* Tutto è nello stesso pacchetto" validatore di pacchetti ";" * ". HibernateValidator richiede la ** definizione pubblica ** per entrambi * descrittore di vincoli (l'annotazione) * e * il validatore di vincoli (la classe di implementazione) * e li ho dichiarati entrambi nello stesso pacchetto e, di conseguenza, il modificatore predefinito ** no il modificatore ** è stato applicato a entrambi (poiché è improbabile che dichiarino più di una classe o un'interfaccia come * public * nello stesso pacchetto). – Tiny
Rimane comunque un problema. Non visualizza ancora messaggi di errore come specificato da [questo] (http://stackoverflow.com/questions/1972933/cross-field-validation-with-hibernate-validator-jsr-303#comment8918149_2155576) commento. Qualcuno conosce il motivo per cui non visualizza i messaggi di errore anche se la convalida viene eseguita correttamente? – Tiny
ok, penso che dovresti pubblicare la tua soluzione sui validatori pacchetto-privato come risposta. Per quanto riguarda i messaggi di errore è probabile che si sia verificato un problema con il modulo: dichiarazione di errori che non è specificata nella domanda. –