Criei uma annotation para validar um campo especifico no meu modelo. A validação de fato funciona, porém ao invés de retornar uma mensagem de erro na pagina XHTML retorna uma Exception. Alguém saberia informar porque isso acontece? Será que tem alguma coisa a ver com os sets ou o java.sql.Date? Desde já grato! E perdão se coloquei a pergunta no lugar errado.
javax.faces.el.EvaluationException: javax.validation.ConstraintViolationException: validation failed for classes [com.placa.model.Placa] during persist time for groups [javax.validation.groups.Default, ]
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:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:787)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1252)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:508)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.validation.ConstraintViolationException: validation failed for classes [com.placa.model.Placa] during persist time for groups [javax.validation.groups.Default, ]
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:132)
at org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:71)
at org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:159)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:69)
at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:179)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)
at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:800)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:774)
at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:778)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:668)
at com.placa.daoimpl.PlacaDAOJPAImp.save(PlacaDAOJPAImp.java:21)
at com.placa.regrasnegocio.PlacaRN.salvaPlaca(PlacaRN.java:16)
at com.placa.web.PlacaMB.salvarPlaca(PlacaMB.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:273)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 28 more
[code]
Annotation
@Constraint(validatedBy = CurrentOrFutureDayValidator.class)
@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentOrFutureDay {
String message() default "Data deve ser igual ou superior a atual";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
} [/code]
Classe de Validação
[code]
import java.sql.Date;
import java.util.GregorianCalendar;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CurrentOrFutureDayValidator implements ConstraintValidator<CurrentOrFutureDay, Date> {
@Override
public void initialize(CurrentOrFutureDay annotation) {
}
@Override
public boolean isValid(Date date,
ConstraintValidatorContext context) {
Date atual = new Date(new GregorianCalendar().getTimeInMillis());
System.out.println("Data atual:" + atual);
System.out.println("Data digitada:" + date);
System.out.println(date.before(atual));
System.out.println(context.getDefaultConstraintMessageTemplate());
return (!date.before(atual));
}[/code]
Classe Validada
[code]
@Entity
@Table(name=“Placa”)
public class Placa implements Serializable{
private static final long serialVersionUID = -2281062167675094359L;
@Id
@GeneratedValue
@Column(name="id")
private Long id;
@CurrentOrFutureDay(message="Data deve ser igual"
+ " ou superior a data atual")
@Column(name="data_inicial", nullable=false)
private Date dataInicialDate;
// @Transient
// @Pattern(regexp="\d{1,2}/\d{1,2}/\d{4}",
// message=“Data com formato inválido”)
// private String dataInicial;
@Column(name="data_final", nullable=false)
private Date dataFinalDate;
// @Transient
// @Pattern(regexp="\d{1,2}/\d{1,2}/\d{4}",
// message=“Data com formato inválido”)
// private String dataFinal;
public void setDataInicial(String dataInicial) {
this.dataInicialDate = DateUtil.StringToSqlDate(dataInicial);
}
public String getDataFinal() {
if(dataFinalDate==null)
return null;
else
return DateUtil.SqlDateToString(dataFinalDate);
}
public void setDataFinal(String dataFinal) {
this.dataFinalDate = DateUtil.StringToSqlDate(dataFinal);
}
public Date getDataInicialDate() {
return dataInicialDate;
}
public void setDataInicialDate(String dataInicialDate) {
this.dataInicialDate = DateUtil.StringToSqlDate(dataInicialDate);
}
public Date getDataFinalDate() {
return dataFinalDate;
}
public void setDataFinalDate(String dataFinalDate) {
this.dataFinalDate = DateUtil.StringToSqlDate(dataFinalDate);
}
}[/code]