exceção errada: InterceptionException no lugar de ConstraintViolationException

Oi pessoal,

tenho uma classe que necessita de uma simples validação:

public class Turma {
	@OneToMany(cascade = CascadeType.ALL)
	private List<DiaDeAula> diasDeAula;
}
public class DiaDeAula {
 @NotNull(message = "Preencha o horário de fim.")
 @Type(type = "org.joda.time.contrib.hibernate.PersistentLocalTimeAsString")
 @Column(nullable = false)
 private LocalTime horaFim;

se nao preencho esse atributo uma ValidationException deveria ser lançada quando executo no meu controller:

this.validator.validate(turma);
this.validator.onErrorForwardTo(this).cadastra();

e entao exibida na view

&lt;c:if test="${not empty errors}"&gt;
						&lt;div id="erros"&gt;
							&lt;c:forEach var="error" items="${errors}"&gt;
								&lt;span class="erros"&gt;${error.message}&lt;/span&gt;
								<br />
							&lt;/c:forEach&gt;
						&lt;/div&gt;
					&lt;/c:if&gt;

porém, por algum motivo a exceção lançada é InterceptionException

segue o stack


br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.validation.ConstraintViolationException: Validation failed for classes [br.com.yarabastos.model.DiaDeAula] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
	ConstraintViolationImpl{interpolatedMessage='Preencha o horário de fim.', propertyPath=horaFim, rootBeanClass=class br.com.yarabastos.model.DiaDeAula, messageTemplate='Preencha o horário de fim.'}
]
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
root cause

javax.validation.ConstraintViolationException: Validation failed for classes [br.com.yarabastos.model.DiaDeAula] during persist time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
	ConstraintViolationImpl{interpolatedMessage='Preencha o horário de fim.', propertyPath=horaFim, rootBeanClass=class br.com.yarabastos.model.DiaDeAula, messageTemplate='Preencha o horário de fim.'}
]
	org.hibernate.cfg.beanvalidation.BeanValidationEventListener.validate(BeanValidationEventListener.java:161)
	org.hibernate.cfg.beanvalidation.BeanValidationEventListener.onPreInsert(BeanValidationEventListener.java:94)
	org.hibernate.action.EntityIdentityInsertAction.preInsert(EntityIdentityInsertAction.java:160)
	org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:65)
	org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
	org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320)
	org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
	org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
	org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252)
	org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392)
	org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335)
	org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:425)
	org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:362)
	org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:338)
	org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204)
	org.hibernate.engine.Cascade.cascade(Cascade.java:161)
	org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:475)
	org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:353)
	org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203)
	org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117)
	org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
	org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685)
	org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677)
	org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673)
	br.com.yarabastos.repository.TurmaHibernateDAO.add(TurmaHibernateDAO.java:27)
	br.com.yarabastos.controller.TurmaController.grava(TurmaController.java:55)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.util.hibernate.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)

alguma ideia de pq é uma excelçao do interceptor ?

pessoal encontrei a resposta

preciso validar tb meus obj DiaDeAula antes de chamar onErrorForwardTo…

ficando assim no controller:

this.validator.validate(turma);
		
		for (DiaDeAula dia : turma.getDiasDeAula()) {
			this.validator.validate(dia);
		}
		
		this.validator.onErrorForwardTo(this).cadastra();

abrassss

vc também pode anotar o atributo diasDeAula da classe turma com @Valid, daí vc não precisa usar o for

genial lucas, mto obrigado

aproveitando

blz eu posso fazer tanto o laço como usar o @valid

mas validando o obj ele sempre vai mostrar a msg de erro:

@NotNull(message = "Preencha o horário de inicio.")

tem como fazer algo semelhante a:

@NotNull(message = "Preencha o horário de inicio do ${this.nome}.")

pois assim se a colecao tiver varios obj o usuario é instruido a corrigir justamente o obj inconsistente.

entende ?

abrassss

não sei se dá pra fazer isso… tem que dar uma olhadinha na documentação. Eu sei que dá pra acessar os valores que vc configurou na anotação, mas os do objeto eu nunca vi…

opa, valeu mesmo lucas

valores configurados na anotacao eu estou a par.

porem precisava do obj mesmo pra poder auxuliar o usuario com oq corrigir…

caso nao ache nada faço a validacao manualmente para customizar isso, caso contrario, caso encontre algo volto a postar se tiver algum progresso

abrasss