[Resolvido] Integração Vraptor + Extjs 4.0, receber dados do formulário

7 respostas
J

Olá pessoal, estou com um problema que talvez seja simples, mas não acho muitos exemplos dessa integração.

Eu tenho um model Grupo:

@Entity
@Component
public class Grupo implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 8586158154880305398L;

	@Id @GeneratedValue
	private long id;
	
	@Length(max=2) @NotNull
	private String codigo;
	
	@Length(max=20) @NotNull
	private String nome;
	
	private boolean pedido;

E um controle que tem o método salvar:

@Resource
public class GrupoController {

	private Result result;
	private GrupoDAO grupoDao;
	
	public GrupoController(Result result, GrupoDAO grupoDao){
		this.result = result;
		this.grupoDao = grupoDao;
	}
	
	@Path("/grupo")
	@Post
	public void salvar(Grupo grupo){	
		System.out.println("entrou");
		System.out.println("grupo: " + grupo.getNome());
		grupoDao.salva(grupo);
	}
}

Só que o método não consegue instanciar o meu retorno do Extjs, o json gerado é:

Segue o meu Store do Extjs( mas acredito que não seja ele o erro):

Ext.define('Projeto.store.Grupos',{
	extend: 'Ext.data.Store',
	model: 'Projeto.model.Grupo',
	autoLoad: false,
	pageSize: 35,
	limit: { start: 0, limit: 35},
	
    proxy: {
        type: 'ajax',
        api: {
            create : '/grupo'
        },
        actionMethods: {  
            create: 'POST'
        },   
        reader: {
            type: 'json',
            root: 'data',
            successProperty: 'success'
        },
        writer: {
            type: 'json',
            writeAllFields: true,
            root: 'data'
        },
        listeners: {
            exception: function(proxy, response, operation){
                Ext.MessageBox.show({
                    title: 'REMOTE EXCEPTION',
                    msg: operation.getError(),
                    icon: Ext.MessageBox.ERROR,
                    buttons: Ext.Msg.OK
                });
            }
        }
    }
	
});

Obrigado desde já,

Jouderian Nobre

7 Respostas

Lucas_Cavalcanti

o json que vc colocou é o que é POSTado pro servidor? não tem como vc passar via form parameters (tipo trocar o ‘json’ por ‘form’ no writer ou coisa do tipo)

J

É esse json que é enviado. trocando o atributo root do writer para grupo(o nome da entidade) e colocando o encode: true, o servidor até reconhece, mas não consegue converter. O store fica assim:

Ext.define('Projeto.store.Grupos',{  
    extend: 'Ext.data.Store',  
    model: 'Projeto.model.Grupo',  
    autoLoad: false,  
    pageSize: 35,  
    limit: { start: 0, limit: 35},  
      
    proxy: {  
        type: 'ajax',  
        api: {  
            create : '/grupo'  
        },  
        actionMethods: {    
            create: 'POST'  
        },     
        reader: {  
            type: 'json',  
            root: 'data',  
            successProperty: 'success'  
        },  
        writer: {  
            type: 'json',  
            writeAllFields: true,  
            root: 'grupo',
            encode: true
        },  
        listeners: {  
            exception: function(proxy, response, operation){  
                Ext.MessageBox.show({  
                    title: 'REMOTE EXCEPTION',  
                    msg: operation.getError(),  
                    icon: Ext.MessageBox.ERROR,  
                    buttons: Ext.Msg.OK  
                });  
            }  
        }  
    }  
      
});

O json gerado:

grupo:{"id":0,"codigo":"1","nome":"nome","pedido":true}

Eu vou tentar essa sua maneira, mas isso seria algo interessante de se fazer? digo não seria algo meio que gambiarra? Ou o vraptor realmente não tem essa integração?

Ps: O erro que está dando ao tentar converter:

16/04/2012 16:51:51 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [default] in context with path [] threw exception
br.com.caelum.vraptor.VRaptorException: Unable to find converter for br.com.projeto.model.Grupo
	at br.com.caelum.vraptor.core.DefaultConverters.to(DefaultConverters.java:59)
	at br.com.caelum.vraptor.http.ognl.VRaptorConvertersAdapter.convert(VRaptorConvertersAdapter.java:59)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.convert(OgnlParametersProvider.java:178)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createSimpleParameter(OgnlParametersProvider.java:174)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:144)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createParameter(OgnlParametersProvider.java:122)
	at br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.getParametersFor(OgnlParametersProvider.java:85)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.getParametersFor(ParametersInstantiatorInterceptor.java:105)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	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.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.util.hibernate.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.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.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.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.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	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:462)
	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:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	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

se está indo um parâmetro pra requisição chamado grupo, vc precisa escrever um converter que transforma o valor do parâmetro em um grupo…

agora se o ExtJS manda um POST em json, com o content-type certo (application/json), tente colocar @Consumes em cima do método do controller.

J

Essa conversão seria manual ou só usando esse @Consumes?

Eu coloquei esse @Consumes e gerou o seguinte erro:

19/04/2012 09:33:55 org.apache.catalina.core.StandardWrapperValve invoke
GRAVE: Servlet.service() for servlet [default] in context with path [] threw exception
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jsonDeserializer': Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.caelum.vraptor.deserialization.JsonDeserializer]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/mapped/Configuration
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:329)
	at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:325)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:263)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:86)
	at br.com.caelum.vraptor.deserialization.DefaultDeserializers.deserializerFor(DefaultDeserializers.java:46)
	at br.com.caelum.vraptor.interceptor.DeserializingInterceptor.intercept(DeserializingInterceptor.java:81)
	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: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.util.hibernate.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.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	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.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.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.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	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:462)
	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:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	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)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.caelum.vraptor.deserialization.JsonDeserializer]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jettison/mapped/Configuration
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:141)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:108)
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280)
	... 57 more
Caused by: java.lang.NoClassDefFoundError: org/codehaus/jettison/mapped/Configuration
	at com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver.<init>(JettisonMappedXmlDriver.java:48)
	at br.com.caelum.vraptor.deserialization.JsonDeserializer.<init>(JsonDeserializer.java:47)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)
	... 59 more
Caused by: java.lang.ClassNotFoundException: org.codehaus.jettison.mapped.Configuration
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1676)
	at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
	... 66 more

Eu preciso adicionar alguma biblioteca?

Agradeço já pelas respostas,

Jouderian Junior

Lucas_Cavalcanti

quase toda vez que der ClassNotFound é pq falta jar. Nesse caso o do jettison
org.codehaus.jettison.mapped.Configuration

e sim, seria com o @Consumes, mas só se a requisição for feita com o content-type correto (application/json)

J

Resolveu agora estou conseguindo receber o Json, só tem um problema, mas aí já não envolve o vraptor, Se eu quiser salvar um model, eu não vou ter o id dele, então eu envio ele vazio, só que o jettison não consegue converter se ele estiver vazio, como eu faria?

Agradeço a ajuda,

Jouderian Nobre

J

Esquece, passei como -1 e o hibernate deu o jeito ele :smiley:

Obrigado pela ajuda. Problema resolvido.

Jouderian Nobre

Criado 16 de abril de 2012
Ultima resposta 20 de abr. de 2012
Respostas 7
Participantes 2