[RESOLVIDO] Receber json no controller com Vraptor +

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:

[code]
public class Itens {
private int codigo;

private String nome;

private SubGrupoEstoque subGrupoEstoque;

    private List<Atributos_Estados> atributos;

    ....

}[/code]

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… :slight_smile:
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

cara,

vc pode usar Xstream para converter seu JSon em Objeto.

t+

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

[quote=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[/quote]

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

}

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) {   
  
} 

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)

bizarro, tenta tirar o setter da lista

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

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"}]}}  

você está gerando esse json como?

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?

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 } } } 

[quote=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 } } } 

[/quote]

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…

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: