[RESOLVIDO] Receber json no controller com Vraptor +

13 respostas
R

Boa Tarde.

Estou com uma dificuldade imensa, em receber um json, gerado pelo extjs, no vraptor.. por isso a busca por ajuda no forum.

Tenho classe Itens:
public class Itens {
	private int codigo;

	private String nome;

	private SubGrupoEstoque subGrupoEstoque;

        private List<Atributos_Estados> atributos;

        ....
}
public class SubGrupoEstoque
public class SubGrupoEstoque {
	private SubGrupoEstoquePK subGrupoEstoquePK;

	private String descricaoSubgrupoEstoque;

	private int codAreaEstoque;
        ...
}
Clase AtributosEstado
public class AtributoEstado {
	
	private AtributoEstadoPK atributoEstadoPk;
        ...
}
Classe Atributos
public class Atributo {
	private int codigo;

	private String descricao;

        ...
Classe Estado
public class Estado {
	private int codigo;

	private String descricao;
        ...
O Json:
{"item":"{\"codigo\":\"5000\",\"nome\":\"FRANGO INTEIRO C/MIUDOS RESF. CX 18 KG\",\"subGrupoEstoque.codAreaEstoque\":\"1\"}","atributoEstados":["{\"atributoEstadoPk.atributo.codigo\":1,\"atributoEstadoPk.estado.codigo\":\"1\"}","{\"atributoEstadoPk.atributo.codigo\":2,\"atributoEstadoPk.estado.codigo\":\"4\"}"]}

A duvida como receber isto num controller.. para que o vraptor já crie meus objetos.. caso isto seje possivel... :)
No controller receber 2 parametros.. um Itens item, List atributoEstados..
public void alterarItem(Itens item, List atributoEstados) {
System.out.println(item.toString());
}

Não sei se fui claro na minha necessidade..

desde já agradeço a ajuda.

Rodrigo

13 Respostas

A

cara,

vc pode usar Xstream para converter seu JSon em Objeto.

t+

Lucas_Cavalcanti

tenta fazer o seguinte:

@Consumes("application/json")
public void alterarItem(Itens item) {

}

se o extjs está usando o content-type correto o VRaptor vai conseguir deserializar o json. Vc vai precisar da biblioteca jettison

R

Lucas Cavalcanti:
tenta fazer o seguinte:

@Consumes("application/json")
public void alterarItem(Itens item) {

}

se o extjs está usando o content-type correto o VRaptor vai conseguir deserializar o json. Vc vai precisar da biblioteca jettison

Lucas,

Para o item funciona… mais para serializar uma lista… devo implementar algum interceptor… ou algo do tipo… o controller seria assim:

@Consumes("application/json")
public void alterarItem(Itens item, List<AtributoEstado> atributoEstados) { 

}
Lucas_Cavalcanti

se você conseguir manipular o json enviado, você pode tentar fazer o seguinte:

{"objetoLegal": <json anterior>}

criar a classe e receber no controller:

public class ObjetoLegal {
     Itens item;
     List<AtributoEstado> atributoEstados;
}


@Consumes("application/json")  
public void alterarItem(ObjetoLegal objetoLegal) {   
  
}
R

Lucas, então criei minha classe:

public class ItensWrapper {

	private Itens item;
	private List<AtributoEstado> atributoEstados;
	public Itens getItem() {
		return item;
	}
	public void setItem(Itens item) {
		this.item = item;
	}
	public List<AtributoEstado> getAtributoEstados() {
		return atributoEstados;
	}
	public void setAtributoEstados(List<AtributoEstado> atributoEstados) {
		this.atributoEstados = atributoEstados;
	}
}

Meu Controller ficou desta forma:

@Post
@Path("/tabelas/updateitem")
@Consumes("application/json")
public void alterarItem(ItensWrapper data) {
   System.out.println(data.getItem().getNome());
   System.out.println(data.getAtributoEstados().size());
}

O Json:

{"data":{"item":"{\"codigo\":\"5000\",\"nome\":\"FRANGO INTEIRO C/MIUDOS RESF. CX 18 KG\",\"subGrupoEstoque.codAreaEstoque\":\"1\"}","atributoEstados":["{\"atributoEstadoPk.atributo.codigo\":1,\"atributoEstadoPk.estado.codigo\":\"1\"}","{\"atributoEstadoPk.atributo.codigo\":2,\"atributoEstadoPk.estado.codigo\":\"4\"}"]}}

Só que esta ocorrendo o seguinte erro:

21/10/2011 16:15:33 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [default] in context with path [/dipweb] threw exception
com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$DuplicateFieldException: atributoEstados
---- Debugging information ----
duplicate-field     : atributoEstados
class               : br.com.diplomata.view.wrapper.ItensWrapper
required-type       : br.com.diplomata.view.wrapper.ItensWrapper
line number         : -1
-------------------------------
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$SeenFields.add(AbstractReflectionConverter.java:322)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:234)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:861)
	at br.com.caelum.vraptor.deserialization.JsonDeserializer.deserialize(JsonDeserializer.java:39)
	at br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:87)
	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.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.diplomata.utils.interceptors.HibernateTransactionInterceptor.intercept(HibernateTransactionInterceptor.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.diplomata.utils.interceptors.VerificaLoginInterceptor.intercept(VerificaLoginInterceptor.java:39)
	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.diplomata.utils.interceptors.ValidaTelasInterceptor.intercept(ValidaTelasInterceptor.java:37)
	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.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.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.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	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:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:498)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:394)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Lucas_Cavalcanti

bizarro, tenta tirar o setter da lista

R

Lucas, tirei e não funcionou, continua o erro.

Deixei o setter e com um elemento na lista ele cria o objeto List, e o Itens. Mas não passa os valores para os objetos criados… como se não achasse os valores no json. apenas criando os objetos.

e com 2 elementos na lista. dá este erro de atributo duplicado

Lucas_Cavalcanti

o estranho é que os jsons estão escapados dentro dos atributos… não deveriam estar assim…

está assim:

{"data":{"item":"{\"codigo\":\"5000\",\"nome\":\"FRANGO INTEIRO C/MIUDOS RESF. CX 18 KG\",\"subGrupoEstoque.codAreaEstoque\":\"1\"}","atributoEstados":["{\"atributoEstadoPk.atributo.codigo\":1,\"atributoEstadoPk.estado.codigo\":\"1\"}","{\"atributoEstadoPk.atributo.codigo\":2,\"atributoEstadoPk.estado.codigo\":\"4\"}"]}}

deveria estar assim:

{"data":{"item":{"codigo":"5000","nome":"FRANGO INTEIRO C/MIUDOS RESF. CX 18 KG","subGrupoEstoque.codAreaEstoque":"1"},"atributoEstados":[{"atributoEstadoPk.atributo.codigo":1,"atributoEstadoPk.estado.codigo":"1"},{"atributoEstadoPk.atributo.codigo":2,"atributoEstadoPk.estado.codigo":"4"}]}}
Lucas_Cavalcanti

você está gerando esse json como?

R

Lucas, estou utilizando o Extjs… Mudei aqui para tirar os “/”… só que agora dá os erros nestes campos do json, por exemplo:

ou

atributoEstadoPk.atributo.codigo:1

Ele não consegue converter os valores para criar os objetos…

RAVE: Servlet.service() for servlet [default] in context with path [/dipweb] threw exception
com.thoughtworks.xstream.converters.ConversionException: atributoEstadoPk.atributo.codigo : atributoEstadoPk.atributo.codigo : atributoEstadoPk.atributo.codigo : atributoEstadoPk.atributo.codigo
---- Debugging information ----
message             : atributoEstadoPk.atributo.codigo : atributoEstadoPk.atributo.codigo
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : atributoEstadoPk.atributo.codigo : atributoEstadoPk.atributo.codigo
class               : br.com.diplomata.view.wrapper.ItensWrapper
required-type       : java.util.ArrayList
line number         : -1
-------------------------------

Acredito que vou te que trabalhar um pouco este json no extjs… ou tem como eu fazer isto no java?

Lucas_Cavalcanti

dá pra fazer em java, mas vc vai precisar de um converter do XStream
e sobrescrever o JSonDeserializer do VRaptor…

o VRaptor espera que o o atributo seja simples…

isso aqui:

{"atributoEstadoPk.atributo.codigo": 1}

deveria ser:

{"atributoEstadoPk" : { "atributo" : {"codigo" : 1 } } }
R

Lucas Cavalcanti:
dá pra fazer em java, mas vc vai precisar de um converter do XStream
e sobrescrever o JSonDeserializer do VRaptor…

o VRaptor espera que o o atributo seja simples…

isso aqui:

{"atributoEstadoPk.atributo.codigo": 1}

deveria ser:

{"atributoEstadoPk" : { "atributo" : {"codigo" : 1 } } }

Obrigado lucas… vou tenta fazer um função javascript. para formatar isto para mim… pois utilizo com opadrão em meu sistema parte java… sempre receber o json da forma esperada pelo vraptor…

Lucas_Cavalcanti

blz, qqer coisa dá um toque.

Dica:

var attr = {};
var path = "atributoEstadoPK.atributo.codigo".split('.');
attr[path[0]][path[1]][path[2]] = 1;

isso gera o json necessário :wink:

Criado 20 de outubro de 2011
Ultima resposta 21 de out. de 2011
Respostas 13
Participantes 3