[RESOLVIDO] - Vraptor - Erro Validação de dados - NullPointer

Pessoal, heelp.

Estou tentando fazer uma validação de dados com vraptor + jsr303.

vejam o código.
jsp.

<c:forEach var="error" items="${errors}">
    ${error.category} - ${error.message}<br />
</c:forEach>
<form action="${pageContext.request.contextPath}/estabelecimento/enviaContato" method="post">
	<div id="Contato">
		<h1>Entre em contato conosco<img src="${pageContext.request.contextPath}/img/bgTopoContCliente.png" /></h1>
		<fieldset>
		<label for="contato.nome"> Nome:
			<input type="text" class="campoObrigatorio nome" name="contato.nome" value="${contato.nome}"/>
		</label>
		<label for="contato.email"> E-mail:
			<input type="text" class="campoObrigatorio email" name="contato.email" value="${contato.email}"/>
		</label>
		<label for="contato.cidade"> Cidade:
			<input type="text" class="campoObrigatorio cidade" name="contato.cidade" value="${contato.cidade}"/>
		</label>
		<label for="contato.mensagem"> Mensagem:
			<textarea class="campoObrigatorio mensagem" name="contato.mensagem" value="${contato.mensagem}"></textarea>
		</label>
		<label class="right">
			<button type="submit" class="btPesquisa">Enviar <span class="pesquisa">Mensagem</span></button>
		</label>
		</fieldset>
	
	</div><!-- Fim div contato  -->
</form>

Controller

@Resource
@Path("/estabelecimento")
@SessionScoped
public class EstabelecimentoController {
	
	private @Inject EmailsEstabelecimentoService emailsEstabelecimentoService;

        private final Result result;
	private Validator validator;
		
	public EstabelecimentoController(Result result, Validator validator){
		this.result = result;
		this.validator = validator;
	}

        @Get("/contato")
	public void contato(){
		
	}

        @Post("/enviaContato")
	public void enviaContato(Contato contato){
		validator.validate(contato);
   	        validator.onErrorUsePageOf(EstabelecimentoController.class).contato();
		try {
			emailsEstabelecimentoService.enviaEmailContato(contato);
		} catch (EmailException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

Contato.java

public class Contato {

	@NotEmpty(message="O nome deve ser digitado!")
	private String nome;
	
	@Pattern(regexp=".+@.+\\.[a-z]+",message="O Email digitado é inválido!")
	private String email;
	
	@NotEmpty(message="A cidade deve ser digitado!")
	private String cidade;
	
	@NotEmpty(message="A mensagem deve ser digitado!")
	private String mensagem;

	public Contato() {
	}

        ....gets e sets

o erro:

SEVERE: Servlet.service() for servlet [default] in context with path [/cliente] threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.NullPointerException
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:89)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at org.apache.catalina.connector.Request.setAttribute(Request.java:1563)
	at org.apache.catalina.connector.RequestFacade.setAttribute(RequestFacade.java:543)
	at javax.servlet.ServletRequestWrapper.setAttribute(ServletRequestWrapper.java:239)
	at br.com.caelum.vraptor.core.DefaultResult.include(DefaultResult.java:66)
	at br.com.caelum.vraptor.validator.DefaultValidator.onErrorUse(DefaultValidator.java:84)
	at br.com.caelum.vraptor.validator.AbstractValidator.onErrorUsePageOf(AbstractValidator.java:55)
	at br.com.apetiteweb.controller.EstabelecimentoController.enviaContato(EstabelecimentoController.java:143)
	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 br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 41 more

O erro acontece quando passa na linha que redireciona caso tenha erro na validação. = validator.onErrorUsePageOf(EstabelecimentoController.class).contato();

Os parametros do objeto Contato está preenchido corretamente.

O que pode estar acontecendo?

Estou usando:
Hibernate 3.6.5
Vraptor 3.3.1
Spring 3.0.5

desde já, agradeço a atenção!

estranho isso, pq tá dando erro dentro do tomcat… qual versão vc tá usando?

Estou usando a versão 7.0.22.
testei com a versão 6.0.33 e também deu o mesmo erro

O mais engraçado é que o mesmo formulario, quando envio 3 vezes , na terceira vez funciona.
Dei uma debugada no código, mas não consegui descobrir o que é.
vi onde estava estourando a exceção.

na classe br.com.caelum.vraptor.core.DefaultResult, no método

public Result include(String key, Object value) {
    	includedAttributes.put(key, value);
        request.setAttribute(key, value);
        return this;
    }

na linha

request.setAttribute(key, value);

que parece que chama alguma classe do tomcat que da pau. Realmente parece ser no tomcat. agora o porque que não sei.
pelo que entendi, essa hora é que o vraptor seta as mensagens de erro na sessão.

Alguem tem uma sugestão?

tem algum momento em que a key é null?

Não. Sempre o key e o value estão preenchidos.

bem estranho então…

se o key e o value não são nulos, não deveria dar null pointer… parece bug do tomcat

Lucas,
o erro só acontece quando o controller é de sessão. Alterei para request e não deu mais o problema.

Vale lembrar também que o erro acontece em qualquer momento que tento setar um parametro na sessão, ou seja, o problema é no método include.

    result.include("key", object);

os controllers não deveriam ser @SessionScoped, principalmente se eles recebem o Result, que é de request.

o problema é que vc tá usando um result antigo, de outro request. Daí dá nullpointer.

se vc tá usando o VRaptor 3.4 e precisar mesmo que o controller seja session scoped (é melhor que não seja), receba o result nos métodos dos controllers

humm
um amigo tinha até sugerido isso, vimos que o result era request.

belezaaa… valeuu