Duvida com os parâmetros do Vraptor

5 respostas
tiagogn

Olá,

Estou tendo problemas com o preenchimento dos parâmetros de um determinado método, utilizando o VRaptor, a assinatura do método se parece com isso:

@SuppressWarnings("unchecked")
@Path ("/services/gravarContato/{appid}/{sessionid}")
public void gravarContato(String appid, 
	String sessionid,
	int id_usuarioempresa,
	int id_usuario,
	int id_departamento,
	int id_cargo,
	int id_usuariotipo,
	String cd_cpf,
	String cd_sexo,
	Date dt_nascimento)

O problema ocorre com os parâmetros do tipo int, quando informo id_cargo, id_departamento ou id_usuario, a URL alcança o método e tudo funciona perfeitamente, porém, quando informo algum dos outros parâmetros: id_usuarioempresa ou id_usuariotipo, simplesmente não funciona, obtenho o seguinte erro:

br.com.caelum.vraptor.http.InvalidParameterException: unable to instantiate type int
	br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:154)
	br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:122)
	br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:85)

java.lang.IllegalArgumentException: Vraptor does not support this interface or abstract type: int
	br.com.caelum.vraptor.http.ognl.GenericNullHandler.instantiate(GenericNullHandler.java:69)
	br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:152)
	br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:122)

Porquê essa situação ocorre? Quando renomeio os parâmetros colocando o “_id” no final, tipo: usuarioempresa_id ou usuariotipo_id e, passando todos, ou, apenas alguns parâmetros, tudo funciona corretamente.

Obrigado.

5 Respostas

Lucas_Cavalcanti

estranho… habilita o log de debug do vraptor, e posta o resultado do log da requisição que deu problema por favor.

tiagogn

Lucas,

Veja o log:

INFO: Server startup in 2963 ms
01:15:23,925 DEBUG VRaptor:82 - VRaptor received a new request
01:15:24,150 DEBUG ToInstantiateInterceptorHandler:53 - Invoking interceptor ResourceLookupInterceptor
01:15:24,150 DEBUG DefaultResourceTranslator:51 - trying to access /services/gravarContato/FA0C84BD13/1d49446fa4034c1f92fb73c736db6232
01:15:24,156 DEBUG VRaptorRequest:86 - Setting appid with [FA0C84BD13]
01:15:24,156 DEBUG VRaptorRequest:86 - Setting sessionid with [1d49446fa4034c1f92fb73c736db6232]
01:15:24,157 DEBUG DefaultResourceTranslator:61 - found resource [DefaultResourceMethod: ContatoResource.gravarContatoContatoResource.gravarContato(String, String, int, int, int, int, int, String, String, Date, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String)]
01:15:24,272 DEBUG LazyInterceptorHandler:58 - Invoking interceptor ParametersInstantiatorInterceptor
01:15:24,279 DEBUG JstlLocalization:83 - couldn't find message bundle, creating an empty one
01:15:24,280 DEBUG ParanamerNameProvider:51 - Found parameter names with paranamer for ContatoResource.gravarContato(String, String, int, int, int, int, int, String, String, Date, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String, String) as [appid, sessionid, id_usuarioempresa, id_usuario, id_departamento, id_cargo, id_usuariotipo, cd_cpf, cd_sexo, dt_nascimento, ds_email, cd_telefoneddd1, cd_telefonenumero1, cd_telefoneramal1, cd_telefoneddd2, cd_telefonenumero2, cd_telefoneramal2, cd_faxddd, cd_faxnumero, cd_faxramal, cd_celularddd, cd_celularnumero, cd_telresddd, cd_telresnumero, cd_telrecddd, cd_telrecnumero, nm_usuario]
01:15:24,298 DEBUG OgnlParametersProvider:160 - Applying  with [FA0C84BD13]
01:15:24,327 DEBUG OgnlFacade:118 - unable to parse expression ''. Ignoring.
01:15:24,328 DEBUG OgnlParametersProvider:160 - Applying  with [1d49446fa4034c1f92fb73c736db6232]
01:15:24,328 DEBUG OgnlFacade:118 - unable to parse expression ''. Ignoring.
01:15:24,333 DEBUG OgnlParametersProvider:160 - Applying  with [16]
01:15:24,333 DEBUG OgnlFacade:118 - unable to parse expression ''. Ignoring.
23/06/2012 01:15:24 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.http.InvalidParameterException: unable to instantiate type int
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:154)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:122)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:85)

a URL passada como exemplo:

http://localhost:8080/teste/services/gravarContato/FA0C84BD13/1d49446fa4034c1f92fb73c736db6232?id_usuarioempresa=16

Obrigado.

Lucas_Cavalcanti

descobri qual é o problema…

vc tem três parametros em que um é substring do outro:

id_usuario, id_usuarioempresa e id_usuariotipo…

e o vraptor tem uma lógica que pega todos os parametros do request que começam com o nome do parametro:

<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/http/ognl/OgnlParametersProvider.java#L205" 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/http/ognl/OgnlParametersProvider.java#L205" target="_blank">caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/http/ognl/OgnlParametersProvider.java#L205</a></h4>
<pre class="onebox"><code class="lang-java"><ol class="start lines" start="195" style="counter-reset: li-counter 194 ;">
<li>			Array.set(array, i, convert(arrayType, values[i], bundle));</li>
<li>		}</li>
<li>		return array;</li>
<li>	}</li>
<li>
</li>
<li>	protected Class getActualType(Type type) {</li>
<li>		return (Class) ((ParameterizedType) type).getActualTypeArguments()[0];</li>
<li>	}</li>
<li>
</li>
<li>	protected Map<String, String[]> parametersThatStartWith(String name) {</li>
<li class="selected">		Map<String, String[]> requestNames = filterKeys(request.getParameterMap(), containsPattern('^' + name));</li>
<li>		return new TreeMap<String, String[]>(requestNames);</li>
<li>	}</li>
<li>}</li>
</ol>
(último método)

assim o vraptor se perde…

uma dica: pq vc não recebe já todos esses valores dentro de um objeto? pq receber um por um?

tiagogn

Lucas,

Obrigado pela resposta, o problema era esse mesmo. Irei coloca-los em um objeto, estava apenas fazendo testes para entender como o framework funciona. Uma ultima questão, eu posso utilizado com objetos compostos? Ex: usuario.empresa.id, isso preencheria o id do objeto Empresa que está dentro do objeto Usuario?

Obrigado.

Lucas_Cavalcanti

sim, usuario.empresa.id funciona, desde que hajam getters e setters correspondentes.

Criado 22 de junho de 2012
Ultima resposta 25 de jun. de 2012
Respostas 5
Participantes 2
Alura VSCode: extensões mais usadas Quais as extensões que podem auxiliar na hora desenvolvimento na IDE Visual Studio Code
Casa do Codigo Seguranca em front-end: Estrategias para mitigar ataques... Por Antonio Luis Rossi — Casa do Codigo