Vraptor3 + Hibernate validations, erro redirecionamento

5 respostas
edipo_luis_federle

Boa noite amigos, depois de horas tentando resolver tal problema resolvi vir pro GUJ tentar :smiley:

Seguinte, tenho um controller com o seguinte metodo:

@Path("/projects")
	@Post
	public void add(final Project project) {
		validator.validate(project);
		rvalidator.onErrorUsePageOf(ProjectController.class).formulario();
		dao.add(project);
		result.redirectTo(this).index();
	}

Meu bean(project) esta usando a validacao via hibernate validations como segue:

@NotEmpty
	private String name;

Porem quando tento submeter o formulario deixando o campo em branco recebo a seguinte exp:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.validator.InvalidStateException: validation failed for: br.com.xisp.models.Project

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.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.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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)

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.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.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.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)

O que acredito esta certo, pois o obj nao foi validato, mas isso nao deveria ir para a tela do form e nessa eu ter a variavel erros com as mensagem ?

Espero ter sido claro.

Abraçø

5 Respostas

Lucas_Cavalcanti

rvalidator?

está assim mesmo no código?

edipo_luis_federle

Ops, não lucas nao esta, digitei errado aqui no forum mesmo :D. Sorry

Lucas_Cavalcanti

estranho, se vc chama o validator.validate ele deveria pegar os erros de validação…

liga o log de debug do vRaptor pra ver se ele tá carregando direitinho as coisas

edipo_luis_federle

Lucas, consegui fazer a validacao funcionar, porem estou lutando com meus testes de unidade agora.

Tenho a seguinte classe de teste:

package br.com.xisp.test.controllers;


import org.jmock.Expectations;
import org.jmock.Mockery;
import org.junit.Before;
import org.junit.Test;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.util.test.HibernateMockValidator;
import br.com.caelum.vraptor.util.test.MockResult;
import br.com.xisp.controllers.ProjectsController;
import br.com.xisp.dao.ProjectDao;
import br.com.xisp.models.Project;

public class ProjectsControllerTest {


	private Mockery mockery;
	private MockResult result;
	private ProjectDao dao;
	private ProjectsController controller;

	@Before
	public void setUp() throws Exception {
		mockery = new Mockery();

		dao = mockery.mock(ProjectDao.class);

		result = new MockResult();
		Validator validator = new HibernateMockValidator();
		controller = new ProjectsController(dao, validator, result);

	}

	@Test
	public void shouldAddAValidProject(){
		Project project = new Project();
		project.setName("Test Project");
		project.setDescription("Description of Test Project");
		willAddTheProject(project);

		controller.add(project);

	}
	
	@Test
	public void shouldUpdateAProject(){
		Project project = new Project();
		project.setName("Test Project");
		project.setDescription("Description of Test Project");
		willUpdateTheProject(project);
		controller.alterar(project);
		
	}

	//@Test(expected=ValidationException.class)
	@Test
	public void shouldNOTAddProject() throws Exception{
		Project project = new Project();

		willNotAddTheProject(project);
		controller.add(project);
	}
	
	
	private void willAddTheProject(final Project project) {
		mockery.checking(new Expectations() {
			{
				one(dao).add(project);
			}
		});
	}
	
	private void willUpdateTheProject(final Project project){
		mockery.checking(new Expectations() {
			{
				one(dao).atualiza(project);
			}
		});
	}

	private void willNotAddTheProject(final Project project) {
		mockery.checking(new Expectations() {
			{
				never(dao).add(project);
			}
		});
	}
}

Porem estou recebendo:

java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator

at br.com.caelum.vraptor.validator.ValidatorLocator.getValidator(ValidatorLocator.java:47)

at br.com.caelum.vraptor.validator.HibernateValidator3.validate(HibernateValidator3.java:47)

at br.com.caelum.vraptor.util.test.HibernateMockValidator.validate(HibernateMockValidator.java:22)

at br.com.xisp.controllers.ProjectsController.add(ProjectsController.java:40)

at br.com.xisp.test.controllers.ProjectsControllerTest.shouldAddAValidProject(ProjectsControllerTest.java:44)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)

at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)

at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)

at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)

at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)

at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)

at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)

at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)

at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)

at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)

at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)

at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)

at org.junit.runners.ParentRunner.run(ParentRunner.java:236)

at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.ClassValidator

at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:247)

 29 more

Alguma luz??

Obrigado

Abraço

edipo_luis_federle

Opa, resolvi trocando o jar para esse http://www.jarfinder.com/index.php/jars/versionInfo/19328

E mudei meu teste para:

@Test
	public void shouldNOTAddProject() throws Exception{
		Project project = new Project();

		willNotAddTheProject(project);
	    try {
	        controller.add(project);
	        Assert.fail();
	    } catch (ValidationException e) {
	       // List<Message> errors = e.getErrors();
	        //asserts nos erros
	    }
	}
Criado 17 de agosto de 2011
Ultima resposta 18 de ago. de 2011
Respostas 5
Participantes 2