Boa noite Galera,
Estou com um problema num exemplo utilizando o Hibernate Validation quando implemento um Validator próprio do tipo ElementType.Type.
Pelo que entendi nesse caso o validator deveria receber a instancia da classe a ser validada ao invés de receber somente a propriedade da classe que quero validar.
Esta é a anotação que criei:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.hibernate.validator.ValidatorClass;
@ValidatorClass(ChegadaMaiorQuePartidaValidator.class)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ChegadaMaiorQuePartida {
String message();
}
Esta é a implementação da validação acima:
import java.util.Date;
import org.hibernate.validator.Validator;
import com.br.sglr.entity.Voo;
public class ChegadaMaiorQuePartidaValidator implements
Validator<ChegadaMaiorQuePartida> {
private ChegadaMaiorQuePartida anotacao;
public void initialize(ChegadaMaiorQuePartida anotacao) {
// TODO Auto-generated method stub
this.anotacao = anotacao;
}
public boolean isValid(Object entidade) {
// TODO Auto-generated method stub
Voo voo = (Voo) entidade;
Date chegada = voo.getDataChegada();
Date partida = voo.getDataPartida();
return chegada.after(partida);
}
}
Basicamente, ela deveria receber um objeto Voo que possui uma data de saida e uma de chegada, e retornar false se a saida for posterior a partida ou true, em caso contrário.
O que acontece é que, caso a validação passe tudo funciona legal.
No entanto, se ela falha, ocorre um erro esse aplicação:
23:37:23,116 SEVERE [application] javax.ejb.EJBTransactionRolledbackException: validation failed for: com.br.sglr.entity.Voo
javax.faces.el.EvaluationException: javax.ejb.EJBTransactionRolledbackException: validation failed for: com.br.sglr.entity.Voo
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:387)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
Aqui a classe que utiliza a validação:
@Entity
@Name("voo")
@Scope(ScopeType.EVENT)
@ChegadaMaiorQuePartida(message = "data de chegada menor que data da partida")
public class Voo {
@Id
@GeneratedValue
private Long Id;
Como disse a validação esta sendo chamada corretamente, pois, quando passo duas datas válidas funciona normalmente, mas quando são inválidas, ao invés de retornar a mensagem ocorre o erro acima.
Obrigado.
[]s