[RESOLVIDO] Dúvida sobre Validator (ExtJS 4 + Json + VRaptor 3.4.0)

Boa Noite a todos,

Estive lendo quase todos os tópicos referente a este assunto de validação retornando um Json para o ExtJS, mas infelizmente não sanei minhas dúvidas.
Realizei vários testes com todas as formas sugeridas em vários posts, até que cheguei em uma codificação que acredito estar mais perto doq preciso.
Apenas necessitando ajustar alguns detalhezinhos. :lol:

Um dos motivos que acredito serem responsáveis pelo meu insucesso, é por se tratar de tópicos antigos, da época que o VRaptor não tinha todos os recursos que tem hoje.

O Cenário é o seguinte: Tenho um formularios de Login, que chega na Controller sem problemas, realiza a validação utilizando validator.checking(), mas depois não consigo retornar um Json válido em caso de erro ou em caso de sucesso.

LoginController.java

@Get
	@Path("/")
	public void loginForm() {
		// Direciona para WEB-INF\jsp\login\loginForm.jsp
	}
	
	@Post
	@Path("/login")
	public void login(SegUsuario segUsuario) {
	    final SegUsuario usuarioLogado = segUsuarioDAO.carrega(segUsuario);
	    validator.checking(new Validations() {{
	    	that(usuarioLogado != null, "error", localization.getMessage("usuario.login"));
	    }});
	    validator.onErrorUse(ExtJSJson.class).from(validator.getErrors()).success(Boolean.FALSE).serialize();
	    usuarioWeb.login(usuarioLogado ); // AUTENTICANDO NA SESSAO O USUARIO LOGADO
	    result.use(ExtJSJson.class).from("").success().serialize();
	}

Este código na controller está gerando a seguinte saída no FireBug:

uncaught exception: You're trying to decode an invalid JSON String: {"data": [{"category": "error","message": "Usuýrio e/ou Senha invýlidos!","parameters": []}],"success": false}{"data": "","success": true}

Alguem poderia me auxiliar neste caso? De que forma devo proceder nestas situações em que meu JS está esperando um {success: true/false} p/ realizar as ações…

handler do botão de “Entrar no sistema”

function doLogin(){
            if(loginForm.getForm().isValid()) {
            	loginForm.getForm().submit({
                    method:'POST',
                    waitTitle: 'Efetuando login no sistema',
                    waitMsg: 'Verificando informações...',

                    success: function(){
                    	loginForm.getForm().reset();
                        var redirect = '/main';
                        window.location = redirect;
                    },

                    failure: function(form, action){
                        if(action.failureType === 'server'){
                            obj = Ext.decode(action.response.responseText);
                            Ext.Msg.show({
                                title : 'Falha no login!',
                                msg : obj.data[0].message,
                                buttons : Ext.Msg.OK,
                                icon : Ext.MessageBox.ERROR,
                                scope : this,
                                width : 150
                            });
                        }else{
                            Ext.Msg.alert('Atenção!', 'Não foi possível autenticar no sistema : ' + action.response.responseText);
                        }
                        loginForm.getForm().reset();
                    }
                });
            }
        };

Valeu pessoal.

o json está sendo gerado duas vezes =(

acho que tem um bugzinho no onErrorUse(ExtJSon)

por enquanto faça o seguinte:

@Post  
    @Path("/login")  
    public void login(SegUsuario segUsuario) {  
        final SegUsuario usuarioLogado = segUsuarioDAO.carrega(segUsuario);  
        List<Message> errors = new Validations() {{  
            that(usuarioLogado != null, "error", localization.getMessage("usuario.login"));  
        }}.getErrors();  
        if (!errors.isEmpty()) {
             result.use(ExtJSJson.class).from(validator.getErrors()).success(Boolean.FALSE).serialize();  
        } else {
             usuarioWeb.login(usuarioLogado ); // AUTENTICANDO NA SESSAO O USUARIO LOGADO  
             result.use(ExtJSJson.class).from("").success().serialize();  
        }
    }  

abre uma issue pra esse bug por favor?

Fala Lucas,

Brigadão pela ajuda, testei o sugerido e funcionou direitinho.

Abri a issue #403, mas não estou habituado a isto, então não sei se a fiz nos padrões necessários.

Até +

obrigado pela issue =)

a única coisa é que deveria estar em inglês, mas eu traduzo lá :wink:

abraços

Estou aqui de novo, mais ou menos pelo mesmo motivo, troquei o jar do vraptor para o mais recente, 3.4.1, em uma aplicação funcionou corretamente mas em outra está dando o seguinte erro no Json…tenho uma classe grupoTela e ela estende Tela, que estende TipoTela…em um dos campos uso, por exemplo grupoTela.tela.tipoTela, não sei se pode ser isso, no extJs aparece esse erro.

Uncaught Ext.Error: Unable to parse the JSON returned by the server: You’re trying to decode an invalid JSON String: {“data”: [{“id”: 9,“descricao”: “11”,“tipoMaterial”: {“id”: 19,“descricao”: “eddd”},“telas”: [true,

e no vraptor esse erro.

Caused by: com.thoughtworks.xstream.core.TreeMarshaller$CircularReferenceException: Recursive reference to parent object
---- Debugging information ----
item-type : org.cinemotion.entity.GrupoTela
converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter

obrigado.

o que mudou é que agora a gente configura o xstream para não ter references… então se vc tem um ciclo na arvore de objetos, dá esse erro (a referencia b que referencia a).

Teria que fazer um exclude da segunda referencia

Poderia exemplificar por favor?
esse é o metodo que insere e o que lista. Queria saber onde faço isso.

[code]@Post
@Path("/grupo/salvar")
public void salvar(GrupoTela grupoTela, String itemselector) throws Exception {
List telas = new ArrayList();
String[] ids = itemselector.split(",");
for (String t : ids) {
Integer id = Integer.parseInt(t);
telas.add(telaService.getById(id));
}

	if (grupoTela != null) {
		if (grupoTela.getId() == null || grupoTela.getId() == 0) {
			// return telaService.insert(tela);
			if (grupoService.insert(grupoTela)) {
				result.use(ExtJSJson.class).from(grupoTela).success(true).serialize();
				return;
			}
		} else {
			// return telaService.update(tela);
			if (grupoService.update(grupoTela)) {
				result.use(ExtJSJson.class).from(grupoTela).success(true)
						.serialize();
				return;
			}
		}
	}

	result.use(ExtJSJson.class).from(grupoTela).success(false).serialize();
	// return false;
}

[/code]
Lista

[code]@Path("/grupo/grid/dados.json")
public void grid(int start, int limit) throws Exception {
List base = grupoService.list();
List grupos = new ArrayList();

	for (int k = start; (k < start + 10) && (k < base.size()); k++)
		grupos.add(base.get(k));

	result.use(ExtJSJson.class).from(grupos).serialize();
}[/code]

a classe grupoTela referencia algum objeto que tem uma referencia pra um grupoTela?

tipo: grupoTela tem um atributo chamado bolinha e bolinha tem um atributo do tipo grupoTela?

Não, somente grupo tela tem a referencia.

O erro aconteceu quando mudei pro novo vraptor 3.4.1 pra parar com a referencia circular.

grupoTela.tela.tipoTela == grupoTela?

se sim, o xstream não vai conseguir se virar mto bem, só se tirar o modo de NO_REFERENCES dele (que corrige a maior parte dos problemas)

grupoTela.tela.tipoTela é pra chamar um atributo do tipo de tela…tipoTela é outra classe…que tela estende…
só me da problema nessa tela, as outras corrigiu a referencia circular direitinho.

o atributo é de outro tipo, mas o objeto que tá guardado lá é um grupoTela? é o mesmo grupoTela?

você pode tentar excluir esse atributo que está dando problemas… mas no caso do extJS vc vai precisar sobrescrever o componente. Quer fazer isso?

É o mesmo grupoTela sim, to dizendo isso pra vc…pq ACHO que seria o problema, nao tenho certeza, com o outor jar essa tela funcionava normal…mudei o JAR ela nem abre mais e da referencia circular.

se é o mesmo cara dá pau mesmo.

tenta fazer o exclude:

result.use(ExtJSJson.class).from(grupoTela).exclude("tela").success(false).serialize();

ou ainda:

result.use(ExtJSJson.class).from(grupoTela).exclude("tela.tipoTela").success(false).serialize();

Era pra colocar esse código no método de salvar né…se for…não deu certo…
creio que nao seja na hr de salvar, pois a lista já nem aparece tb…será que nãoi tem a ver com hibernate, alguma anotação, ja me falaram aqui pra ver se tem alguma lsita vindo EAGER, pra mudar pra LAZY…

esse exclude que eu te passei é pra evitar a circular reference… parou de dar esse erro?

Meu erro é esse…
You’re trying to decode an invalid JSON String: {“data”: [{“id”: 9,“descricao”: “11”,“tipoMaterial”: {“id”: 19,“descricao”: “eddd”},“telas”: [true,

mas dá algum erro no servidor?

se sim, pega o atributo que tá dando erro e tenta dar exclude nele

Da isso no console

10:42:48,308 DEBUG [DefaultExceptionMapper] find for exception class com.thoughtworks.xstream.core.TreeMarshaller$CircularReferenceException
Abr 19, 2012 10:42:48 AM org.apache.catalina.core.StandardWrapperValve invoke
Grave: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: com.thoughtworks.xstream.core.TreeMarshaller$CircularReferenceException: Recursive reference to parent object
---- Debugging information ----
item-type : org.cinemotion.entity.GrupoTela
converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter

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.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
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.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.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.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.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:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:378)
at org.springframework.security.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
at org.springframework.security.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
at org.springframework.security.ui.SessionFixationProtectionFilter.doFilterHttp(SessionFixationProtectionFilter.java:67)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
at org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(ExceptionTranslationFilter.java:101)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
at org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter.doFilterHttp(SecurityContextHolderAwareRequestFilter.java:91)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
at org.springframework.security.ui.AbstractProcessingFilter.doFilterHttp(AbstractProcessingFilter.java:277)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
at org.springframework.security.ui.logout.LogoutFilter.doFilterHttp(LogoutFilter.java:89)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
at org.springframework.security.context.HttpSessionContextIntegrationFilter.doFilterHttp(HttpSessionContextIntegrationFilter.java:235)
at org.springframework.security.ui.SpringSecurityFilter.doFilter(SpringSecurityFilter.java:53)
at org.springframework.security.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:390)
at org.springframework.security.util.FilterChainProxy.doFilter(FilterChainProxy.java:175)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)

Caused by: com.thoughtworks.xstream.core.TreeMarshaller$CircularReferenceException: Recursive reference to parent object
---- Debugging information ----
item-type : org.cinemotion.entity.GrupoTela
converter-type : com.thoughtworks.xstream.converters.reflection.ReflectionConverter

at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:63)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshallField(AbstractReflectionConverter.java:229)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.writeField(AbstractReflectionConverter.java:208)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.<init>(AbstractReflectionConverter.java:171)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:116)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:72)
at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:70)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshallField(AbstractReflectionConverter.java:229)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.writeField(AbstractReflectionConverter.java:208)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.<init>(AbstractReflectionConverter.java:171)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:116)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:72)
at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:70)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:43)
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.writeItem(AbstractCollectionConverter.java:64)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.marshal(CollectionConverter.java:55)
at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:70)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshallField(AbstractReflectionConverter.java:229)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.writeField(AbstractReflectionConverter.java:208)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.<init>(AbstractReflectionConverter.java:171)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:116)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:72)
at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:70)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:43)
at com.thoughtworks.xstream.core.TreeMarshaller.start(TreeMarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.marshal(AbstractTreeMarshallingStrategy.java:37)
at com.thoughtworks.xstream.XStream.marshal(XStream.java:894)
at com.thoughtworks.xstream.XStream.marshal(XStream.java:883)
at com.thoughtworks.xstream.XStream.toXML(XStream.java:856)
at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.serialize(XStreamSerializer.java:142)
at br.com.caelum.vraptor.util.extjs.DefaultExtJson.serialize(DefaultExtJson.java:89)
at org.cinemotion.controller.GrupoTvController.grid(GrupoTvController.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
... 66 more

mesmo com o exclude nas propriedades? vai tentando excluir até vc achar qual tá dando pau…

provavelmente é o atributo tela.