[RESOLVIDO]VRAPTOR 3 - Dúvidas com o Validator[/RESOLVIDO]

10 respostas
D

Pessoal,

Estou montando uma API REST com o VRAPTOR, por tanto não tenho VIEW, ao efetuar a validação no controller conforme abaixo, o método onErrorUse tenta enviar para um recurso inexistente, eu sei que ele tem que enviar para algum lugar e por default o Vraptor faz isso, mas eu só quero devolver ao requisitante do serviço os erros retornados pelo validator, tem alguma outra maneira?

validator.checking(new Validations(){{  
	            that(tracking.getTagId() != null, "erro", "tagid_null");  
	            that(tracking.getUpdated() != null, "erro", "updated_null");  
	            that(tracking.getLat() != null, "erro", "lat_null");
	            that(tracking.getLon() != null, "erro", "lon_null");
	        }});  
	        
		validator.onErrorUse(Results.status()).badRequest(validator.getErrors());

Obrigado.

10 Respostas

Lucas_Cavalcanti

tenta usar o:

validator.onErrorSendBadRequest();

ele já serializa os erros no content-type pedido através do header Accept.

D

Fala Lucas,

deu o mesmo problema ele redireciona automaticamente para o recurso/nome do método, já havia tentado esse também e até tentei a combinação de alguns outros.

HTTP Status 404 - /mypetslife/WEB-INF/jsp/tracking/add.jsp

type Status report

message /mypetslife/WEB-INF/jsp/tracking/add.jsp

description The requested resource (/mypetslife/WEB-INF/jsp/tracking/add.jsp) is not available.
Apache Tomcat/7.0.29
D

Segue o Méthodo completo.

@Public
 	@Post
	@Path("/add")
	@Consumes(value={"application/json", "application/x-www-form-urlencoded"})
	public void add(final Tracking tracking) {

		validator.checking(new Validations(){{  
	            that(tracking.getTagId() != null, "erro", "tagid_null");  
	            that(tracking.getUpdated() != null, "erro", "updated_null");  
	            that(tracking.getLat() != null, "erro", "lat_null");
	            that(tracking.getLon() != null, "erro", "lon_null");
	        }});  
	        
		//validator.onErrorUse(Results.status()).badRequest(validator.getErrors());
		validator.onErrorSendBadRequest(); 
		
		DynamoDBMapper mapper = new DynamoDBMapper(dynamoDB);
		// put the item to the table
		try {
			//TODO - Efetuar a validação de todos os campos obrigatórios
			mapper.save(tracking);
		} catch (AmazonServiceException ase) {
			System.err.println("Failed to create item in " + tableName);
			result.use(Results.status()).badRequest("Failed to create item in " + tableName);
		}
		result.use(Results.status()).ok();
	}

Estou testando usando REST client do Firefox, quando eu passo os parametros corretamente recebo o HTTP 200 numa boa.

Lucas_Cavalcanti

ta passando o header Accept: application/json ?

D

Estou passando como “application/x-www-form-urlencoded” como o request body vazio.

Quando eu envio todos os parametros eu recebo o http ok 200 normalmente, porém se deixo o request body em branco para testar com o validator, o validator funcionanormalmente, porém o sendbadrequest envia para o recurso inexistente.

D

na verdade no header só tenho o content-type=application/x-www-form-urlencoded, tenho que colocar alguma outra coisa no header?

Lucas_Cavalcanti

se vc quer receber um json vc deveria passar o header:

Accept: application/json
D

Colocando o Accept: application/json

Recebo o seguinte erro:

Grave: Unhandled exception occurred whilst decorating page
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method badRequest
	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.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:101)
	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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	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.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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	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:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	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:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method badRequest
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45)
	at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	at br.com.caelum.vraptor.view.DefaultValidationViewsFactory$1.intercept(DefaultValidationViewsFactory.java:73)
	at br.com.caelum.vraptor.proxy.CglibProxifier$2.intercept(CglibProxifier.java:95)
	at br.com.caelum.vraptor.view.Status$$EnhancerByCGLIB$$2029cb4d.badRequest(<generated>)
	at br.com.caelum.vraptor.validator.AbstractValidator.onErrorSendBadRequest(AbstractValidator.java:61)
	at br.com.mypetslife.controller.TrackingController.add(TrackingController.java:56)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 50 more
Caused by: java.lang.NullPointerException
	at br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization.getXStream(XStreamJSONSerialization.java:93)
	at br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization.getSerializer(XStreamJSONSerialization.java:66)
	at br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization.from(XStreamJSONSerialization.java:61)
	at br.com.caelum.vraptor.serialization.DefaultRepresentationResult.from(DefaultRepresentationResult.java:77)
	at br.com.caelum.vraptor.view.DefaultStatus.badRequest(DefaultStatus.java:146)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	... 61 more

Nov 22, 2012 4:59:56 PM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet [default] in context with path [/mypetslife] threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method badRequest
	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.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:101)
	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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:93)
	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.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.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
	at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
	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:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	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:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:722)
Caused by: net.vidageek.mirror.exception.ReflectionProviderException: Could not invoke method badRequest
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:45)
	at net.vidageek.mirror.invoke.MethodHandlerByMethod.withArgs(MethodHandlerByMethod.java:54)
	at br.com.caelum.vraptor.view.DefaultValidationViewsFactory$1.intercept(DefaultValidationViewsFactory.java:73)
	at br.com.caelum.vraptor.proxy.CglibProxifier$2.intercept(CglibProxifier.java:95)
	at br.com.caelum.vraptor.view.Status$$EnhancerByCGLIB$$2029cb4d.badRequest(<generated>)
	at br.com.caelum.vraptor.validator.AbstractValidator.onErrorSendBadRequest(AbstractValidator.java:61)
	at br.com.mypetslife.controller.TrackingController.add(TrackingController.java:56)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 50 more
Caused by: java.lang.NullPointerException
	at br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization.getXStream(XStreamJSONSerialization.java:93)
	at br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization.getSerializer(XStreamJSONSerialization.java:66)
	at br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization.from(XStreamJSONSerialization.java:61)
	at br.com.caelum.vraptor.serialization.DefaultRepresentationResult.from(DefaultRepresentationResult.java:77)
	at br.com.caelum.vraptor.view.DefaultStatus.badRequest(DefaultStatus.java:146)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at net.vidageek.mirror.provider.java.PureJavaMethodReflectionProvider.invoke(PureJavaMethodReflectionProvider.java:38)
	... 61 more
Lucas_Cavalcanti
estranho… ele  nullpointer numa linha

<aside class="onebox githubblob">
  <header class="source">
      <a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/serialization/xstream/XStreamJSONSerialization.java#L93" target="_blank">github.com</a>
  </header>
  <article class="onebox-body">
    <h4><a href="https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/serialization/xstream/XStreamJSONSerialization.java#L93" target="_blank">caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/serialization/xstream/XStreamJSONSerialization.java#L93</a></h4>
<pre class="onebox"><code class="lang-java"><ol class="start lines" start="83" style="counter-reset: li-counter 82 ;">
<li>
</li>
<li>	/**</li>
<li>	 * You can override this method for configuring XStream before serialization</li>
<li>	 *</li>
<li>	 * @deprecated prefer overwriting XStreamBuilder</li>
<li>	 * @return a configured instance of xstream</li>
<li>	 */</li>
<li>	@Deprecated</li>
<li>	protected XStream getXStream() {</li>
<li>	return builder.jsonInstance();</li>
<li class="selected">	}</li>
<li>
</li>
<li>	/**</li>
<li>	 * You can override this method for configuring Driver before serialization</li>
<li>	 * @deprecated Override this method on XStreamBuilderImpl instead. WARN: this method will be ignored!</li>
<li>	 * @return configured hierarchical driver</li>
<li>	 */</li>
<li>	@Deprecated</li>
<li>	protected HierarchicalStreamDriver getHierarchicalStreamDriver() { return null; }</li>
<li>
</li>
<li>}</li>
</ol>

que não deveria ter null… um builder que vem do construtor…

vc sobrescreveu o XStreamBuilder?

tentou dar um clean no projeto e no servidor?

D

Lucas,

Você tem razão o problema é que eu criei um custom Serialization extendendo a classe XStreamJSONSerialization, para fazer alguns testes.

Removi esse componente que criei e funcionou.

Obrigado.

Criado 22 de novembro de 2012
Ultima resposta 23 de nov. de 2012
Respostas 10
Participantes 2
Fiap Graduacao em Tecnologia — FIAP Analise e Desenvolvimento de Sistemas, Engenharia de Software e mais
Casa do Codigo Casa do Codigo — Livros de tecnologia Livros de programacao, infraestrutura e inovacao