Interceptar classes DAO

307 views
Skip to first unread message

Rafael Dipold

unread,
Feb 9, 2012, 5:39:50 PM2/9/12
to caelum-...@googlegroups.com
Olá,

Estou usando conceito de Multitenancy em meu projeto e gostaria que algumas classes entidade como por ex. Pais, Estado, Municipio... fossem de acesso universal entre todos os "tenancys" evitando assim duplicidade de informações.

Para solucionar o problema criei um Interceptor que muda o namespace temporariamente para o namespace "universal" caso seja executado algum método das classes anotadas com @Universal tais como PaisController, EstadoController, MunicipioController, etc.

O problema que, por ex., a classe ClienteController faz em um momento uma consulta do endereço do cliente e executa diretamente o DAO das entidades Pais/Estado/Municipio para obter os dados do endereço.

Penso que a melhor solução seria interceptar diretamente o dao do Pais/Estado/Municipio porém o Interceptor intercepta somente classes @Resources e criar um Anotation para cada variável local não me parece uma boa idéia.

Enfim, existe alguma maneira de usar o Interceptor do VRaptor para interceptar diretamente os DAOs ou alguma outra solução interessante para o caso?

Bruno Fuster

unread,
Feb 9, 2012, 5:48:13 PM2/9/12
to caelum-...@googlegroups.com
Olá

Uma sugestão:

- Continuar usando o interceptor para identificar o Tenant da request atual
- Anotar as entities Pais/Estado/Municipio com alguma annotation marota tipo a @Universal
- Verificar no DAO se a entidade atual tem essa annotation e ignorar ou não o filtro de tenancy

Acho que dessa forma você poderia até tirar o @Universal dos controllers e preocupar-se apenas com as entidades.

Abs


2012/2/9 Rafael Dipold <dip...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/Wiy_ww6_TVYJ.
To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.



--
Bruno Fuster

Rafael Dipold

unread,
Feb 9, 2012, 6:18:39 PM2/9/12
to caelum-...@googlegroups.com
Obrigado Bruno pela sugestão.

Sua sugestão é uma boa também, porém vou poluir meu DAO com verificações e troca de namespace dentro de métodos como o select por exemplo e que também não me parece ser uma boa.

De qualquer forma sua solução é bem melhor que sair criando annotation para cada variável local.

O ideal seria que o VRaptor tivesse um annotation tipo @ClassIntercept e que serveria para interceptar métodos de classes que não sejam do tipo @Resources...

Bruno Fuster

unread,
Feb 9, 2012, 7:11:01 PM2/9/12
to caelum-...@googlegroups.com
Opa Rafael,

Você pode fazer da forma que comentou usando AOP... o spring tem uma integracao legal com aspectj pra facilitar...



[]s

2012/2/9 Rafael Dipold <dip...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/iKU3x0fXyd8J.

To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.



--
Bruno Fuster

Bruno Fuster

unread,
Feb 9, 2012, 7:13:31 PM2/9/12
to caelum-...@googlegroups.com
Você ta usando hibernate? Talvez consiga resolver melhor com a feature nova do 4...



--
Bruno Fuster

Otávio Garcia

unread,
Feb 9, 2012, 8:30:05 PM2/9/12
to caelum-...@googlegroups.com

Voce particiona os dadozls de cada cliente em schemas separados? Nesse caso basta deixar as tabelas de localizacaoe com sinônimo público.

Sent from my Motorola Atrix™

Lucas Cavalcanti

unread,
Feb 9, 2012, 8:40:45 PM2/9/12
to caelum-...@googlegroups.com
dá uma olhada nesse componente:


ele pode ajudar a criar urls do tipo http://localhost:8080/<contexto>/<tenant>/uri/do/controller

2012/2/9 Otávio Garcia <ota...@otavio.com.br>

Rafael Dipold

unread,
Feb 9, 2012, 9:46:54 PM2/9/12
to caelum-...@googlegroups.com
Opa,

Lucas e Otávio
Meu projeto é no GAE então multitenancy é feito de acordo com as regras que o Google impõe então a sobreposição das rotas não funcionaria. Na verdade é muito simples basta criar um Filter para setar o Namespace de acordo com o domínio do cliente (no meu caso Google Apps) e para as entidades universais ou públicas bastaria fazer algo assim:

    public boolean accepts(ResourceMethod method) {
        return method.getClass().getAnnotation(Universal.class) != null;
    }

    @Override
    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {
       
        this.oldNamespace = NamespaceManager.get();
        NamespaceManager.set("UNIVERSAL");
        try {
            stack.next(method, resourceInstance);
        } finally {
            NamespaceManager.set(this.oldNamespace);
        }
    }
 
Só que caio no problema que relatei no primeiro tópico porque eu deveria interceptar o DAO e não Controller das entidades públicas/universais.

Bruno, estou desenvolvendo sistema em cima do GAE então não há hibernate. Quanto ao Spring eu estou usando Guice por ser mais leve e rápido para o GAE. Deve ter como fazer isso no Guice também, vou pesquisar e dar uma estudada pra ver se consigo fazer sozinho.


Caso alguém saiba como poderia ser feito isso com o Guice eu ficaria mt grato. 

Rafael Dipold

unread,
Feb 12, 2012, 8:56:55 PM2/12/12
to caelum-...@googlegroups.com
Bah pessoal não estou conseguindo resolver esse enigma...
  • Tenho um DAOJPA10 que é um GenericDao e uma implementação desse para cada entidade ex. ClienteDAO
  • Tenho as entidades que gostaria que fossem públicas/universais anotadas com @Universal
Fiz as classes a seguir para interceptar qualquer método do meus Dao's:

public class CustomProvider extends GuiceProvider {
    @Override
    protected Module customModule() {
        final Module module = super.customModule();

        return new AbstractModule() {
            public void configure() {
                module.configure(binder());

                bindInterceptor(Matchers.subclassesOf(DAOJPA10.class), Matchers.any(), new UniversalAOPInterceptor());
            }
        };
    }
}

public class UniversalAOPInterceptor implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        String oldNamespace = NamespaceManager.get();
        if ((((ParameterizedType)
invocation.getThis().getClass().getGenericSuperclass()).getActualTypeArguments()[0]).getClass().isAnnotationPresent(Universal.class))
            NamespaceManager.set("UNIVERSAL");
        try {
            return invocation.proceed();
        } finally {
            NamespaceManager.set(oldNamespace);
        }
    }
}

Porém não estou conseguindo capturar o argumento genérico da superclasse pois o
getGenericSuperclass() da classe acima imprime
    br.com.aplicacao.model.dao.ClienteDAO
em vez de
    br.com.aplicacao.model.dao.DAOJPA10<br.com.aplicacao.model.entity.Cliente>

O engraçado que o mesmo ocorre no meu GenericDao pois eu tinha no meu construtor funcionando:
    this.clazz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
e após ativar o bindInterceptor começou a dar erro por não mais retornar o argumento genérico da superclasse.

Se alguém tiver alguma idéia o que estou fazendo de errado eu ficaria muito grato...

Otávio Garcia

unread,
Feb 12, 2012, 9:01:37 PM2/12/12
to caelum-...@googlegroups.com
Tente com

clazz = (Class<T>) ((ParameterizedType) getClass().getSuperclass().getGenericSuperclass()).getActualTypeArguments()[0];

2012/2/12 Rafael Dipold <dip...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/2hvNFr_PobUJ.

Rafael Dipold

unread,
Feb 13, 2012, 7:13:57 AM2/13/12
to caelum-...@googlegroups.com
Putz acertou na mosca! Vlw Otávio, acabei de testar e funcionou em ambos os casos. Obrigadão. Tópico encerrado!

O engraçado que se comentar a linha do bindInterceptor terei que alterar o construtor da classe DAOJPA10 para a chamada antiga sem o getSuperClass().
O Guice de alguma forma modifica o comportamento padrão da reflection do Java mas isso eu já não sei explicar o porquê.


Movi as anotações @Universal das entidades para os DAO's para o código ficar menos poluído. Não sei se essa foi a melhor maneira de resolver o problema de interceptação de Dao's mas agora está funcionando perfeitamente. Primeira vez que me aventuro com Guice então caso venha a ser útil para alguém segue a solução:


public class UniversalAOPInterceptor implements MethodInterceptor {
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        String oldNamespace = NamespaceManager.get();
        if (invocation.getThis().getClass().getSuperclass().isAnnotationPresent(Universal.class))

Lucas Cavalcanti

unread,
Feb 13, 2012, 7:29:51 AM2/13/12
to caelum-...@googlegroups.com
qdo vc fala pro guice dar um bindInterceptor ele não injeta mais a classe de verdade, e sim um proxy, pra ele conseguir
adicionar o comportamento do interceptor...

a mesma coisa se vc usar o modulo aop.

2012/2/13 Rafael Dipold <dip...@gmail.com>

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To view this discussion on the web visit https://groups.google.com/d/msg/caelum-vraptor/-/e70qUbAQMmwJ.

Rafael Dipold

unread,
Feb 13, 2012, 7:46:37 AM2/13/12
to caelum-...@googlegroups.com
Ahh entendi.. agora outras coisas fizeram sentido também.. vlw Lucas

Morar no interior é f*... Precisava de uns amigos gurus assim por aqui...

Jose Maria de Oliveira

unread,
Feb 13, 2012, 10:03:38 AM2/13/12
to caelum-...@googlegroups.com

Pessoal, bom dia.

 

Estou fazendo um upload de um arquivo CSV.

 

A leitura do arquivo este sendo executada e os dados gravados na base.

 

Porém, no submit do meu form (AJAX) não está recuperando o retorno do JSON de sucesso e no console da aplicação está mostrando a seguinte informação:

INFO [CommonsUploadMultipartInterceptor] Request contains multipart data. Try to parse with commons-upload.

 

Este é meu código:

                @Post("/user/import/") 

                public void importUsers(final UploadedFile fileUpload) {

                               BufferedReader in = new BufferedReader(new InputStreamReader(fileUpload.getFile()));

                              

                               try {

                                               this.userImportCmp.readFile(new File(in.readLine()), userSession.getUser());

                                              

                                               //result.use(ExtJSJson.class).from(new GOVMessage(localization.getMessage(GovSuccessKeyList.USER_UPDATE_SUCCESS.getKey()))).success(true).serialize();

                                               result.use(ExtJSJson.class).from(EccoxUtil.EMPTY).success(true).serialize();

                                              

                               } catch (IOException e) {

                                               e.printStackTrace();

                                               result.use(ExtJSJson.class).from(EccoxUtil.EMPTY).success(false);

                                               return;

                                              

                               } catch (SystemException e) {

                                               e.printStackTrace();

                                               result.use(ExtJSJson.class).from(EccoxUtil.EMPTY).success(false);

                                               return;

                               }

                }

 

E no ExtJS :

    if (form.isValid()) {

            form.submit({

                method: 'POST',

                url: APP_PATH + '/user/import/',

                enctype: 'multipart/form-data',

                waitTitle              : message.processing.title,

                waitMsg: 'Carregando o seu arquivo...',

                success: function(frm, act){

                               console.log('success');

                                // No retorno quero abrir um janela de resumo da importação, mas não está chegando aqui

               }                               

           });

    }

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

Carlos Alberto Junior

unread,
Feb 13, 2012, 10:05:35 AM2/13/12
to caelum-...@googlegroups.com
Buenas,


Verifique se o arquivo está realmente indo para o servidor...o seu form contém o enctype="multipart/form-data" ? Está sendo gerada alguma exception no console além do info padrão do VRaptor ?

Tente imprimir no console o conteúdo do arquivo (por desencargo de consciência)



Atenciosamente,
Carlos Alberto Junior Spohr Poletto




On Mon, Feb 13, 2012 at 13:03, Jose Maria de Oliveira <jose.O...@eccox.com.br> wrote:
CommonsUploadMultipartInterceptor

Jose Maria de Oliveira

unread,
Feb 13, 2012, 10:19:42 AM2/13/12
to caelum-...@googlegroups.com

Bom dia Carlos, tudo bem?

 

a)      Está imprimindo somente a INFO.

b)      O arquivo está chegando e os dados estão sendo persistidos.

c)       Está com “multpart/form-data”.

d)      Imaginei que o motivo de não retornar o ‘success’ do json por causa da informação que está sendo mostrada.

 

 

Obrigado.

 

Abs

 

 

 

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

--

Lucas Cavalcanti

unread,
Feb 13, 2012, 10:17:25 AM2/13/12
to caelum-...@googlegroups.com
Não dá pra fazer upload via ajax... os browsers não suportam...

vc precisa usar algum plugin do extJS baseado em flash pra isso funcionar

2012/2/13 Carlos Alberto Junior <carlosj...@gmail.com>

Lucas Cavalcanti

unread,
Feb 13, 2012, 10:18:31 AM2/13/12
to caelum-...@googlegroups.com
peraí, funcionou, mas não entrou no success?

2012/2/13 Lucas Cavalcanti <lucasm...@gmail.com>

Jose Maria de Oliveira

unread,
Feb 13, 2012, 10:22:18 AM2/13/12
to caelum-...@googlegroups.com

Exato!

 

 

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

De: caelum-...@googlegroups.com [mailto:caelum-...@googlegroups.com] Em nome de Lucas Cavalcanti
Enviada em: segunda-feira, 13 de fevereiro de 2012 13:19
Para: caelum-...@googlegroups.com
Assunto: Re: Upload

 

peraí, funcionou, mas não entrou no success?

Lucas Cavalcanti

unread,
Feb 13, 2012, 10:21:06 AM2/13/12
to caelum-...@googlegroups.com
tenta ver no console do browser (Developer tools, ou Firebug) qual foi o retorno da requisição...

vê se o json está aparecendo.

2012/2/13 Jose Maria de Oliveira <jose.O...@eccox.com.br>

Jose Maria de Oliveira

unread,
Feb 13, 2012, 10:24:59 AM2/13/12
to caelum-...@googlegroups.com

Uncaught Ext.Error: You're trying to decode an invalid JSON String: <pre style="word-wrap: break-word; white-space: pre-wrap;">{"data": "","success": true}</pre>

Lucas Cavalcanti

unread,
Feb 13, 2012, 10:24:32 AM2/13/12
to caelum-...@googlegroups.com
a resposta tá vindo com esse <pre ?

dá uma olhada se não tem algum template passando nessa requisição

Jose Maria de Oliveira

unread,
Feb 13, 2012, 10:28:30 AM2/13/12
to caelum-...@googlegroups.com

Ok Lucas.

 

Vou ver.

 

Obrigado.

 

Abs

Carlos Alberto Junior

unread,
Feb 13, 2012, 10:38:56 AM2/13/12
to caelum-...@googlegroups.com
Acho que o problema está justo nesse código HTML retornado..acho que o Lucas matou o problema :)


Atenciosamente,
Carlos Alberto Junior Spohr Poletto




Jose Maria de Oliveira

unread,
Feb 14, 2012, 6:15:00 AM2/14/12
to caelum-...@googlegroups.com

Pessoal bom dia,

 

A forma como o componente de upload do Ext trabalha, tive que colocar no meu controller o contenttype.

 

this.response.setContentType("text/html");

 

Desta forma, consegui obter o retorno de sucesso no retorno.

 

Obrigado a todos.

 

Abs

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

Rafael Dipold

unread,
Feb 20, 2012, 10:47:41 AM2/20/12
to caelum-...@googlegroups.com
Lucas,

É possível injetar um @Component ou um Validator nessa classe UniversalAOPInterceptor ? Se sim qual seria o procedimento?

Lucas Cavalcanti

unread,
Feb 20, 2012, 12:04:30 PM2/20/12
to caelum-vraptor
Então, vc não precisa fazer esse bind, pq o próprio VRaptor faz isso..


troque o @Inject pra validator, pra 

@Inject private Provider<Validator> validator;


daí vc usa o validator.get(), assim ele vai usar o validator da requisição atual.


[]'s
2012/2/20 Rafael Dipold <dip...@gmail.com>
O bindInterceptor recebe objeto. Tentei pedir a injeção na mão mas o Guice não sabe como instanciar o DefaultValidator por não encontrar um construtor adequado (sem parâmetros).

    UniversalAOPInterceptor interceptor = new UniversalAOPInterceptor();

    bind(Validator.class).to(DefaultValidator.class);
               
    requestInjection(interceptor);

e no UniversalAOPInterceptor:

    @Inject private Validator validator;

Na verdade mesmo eu queria instanciar um @Component que está em @SessionScope que controla, em um sistema multi-empresa, qual empresa o usuário "conectou", ou seja, todos relatórios, cadastros, etc. filtrarão a empresa selecionada e caso a sessão expire, o validator forçaria o usuário a selecionar novamente a empresa que ele gostaria de operar no momento.
É mais fácil controlar isso interceptando os DAO's do que os Controllers, só que acabei perdendo a vantagem da praticidade de DI do VRaptor...

P.S. Desculpe não sabia que clicar em "Responder ao autor" seria enviado diretamente ao seu email sem criar uma postagem no grupo.
--
Rafael Dipold
dip...@gmail.com

On 20/02/2012 13:48, Lucas Cavalcanti wrote:
teoricamente sim, 
não lembro se no bindInterceptor ele recebe a classe ou a instância do interceptor. Se for a classe ele vai injetar direitinho. Se for o objeto,
talvez vc precise pedir a injeção na mão.

2012/2/20 Rafael Dipold <dip...@gmail.com>
Lucas,

É possível injetar um @Component ou um Validator nessa classe UniversalAOPInterceptor ? Se sim qual seria o procedimento?


Em segunda-feira, 13 de fevereiro de 2012 10h29min51s UTC-2, Lucas Cavalcanti escreveu:

Rafael Dipold

unread,
Feb 20, 2012, 12:24:37 PM2/20/12
to caelum-...@googlegroups.com
É isso mesmo Lucas, funcionou.

Eu já estava escrevendo que havia conseguido usando o método getProvider no construtor do interceptor mas fica melhor assim injetando nos fields.

Obrigado mais uma vez pela ajuda.

Jose Maria de Oliveira

unread,
Feb 28, 2012, 2:07:22 PM2/28/12
to caelum-...@googlegroups.com

Pessoal, boa tarde,

 

De uma lista serializada com ExtJSon,    o primeiro item está com o valores de seus atributos correto:

controller: Object

                controllerCode: "TESTE"

                controllerKey: "TESTE"

                id: 2

                               methods: Array[3]

                               0: Object

                                               controller: Object

                                               id: 1

                                               methodCode: "Action 1"

                                               methodKey: "Action 1"

 

A partir do segundo item no lugar dos valores dos atributos, aparece a referência do objeto:

controller: Object

                @reference: "../../br.com.eccox.gov.model.Menu/controller"

 

Antes de serializar, listei os valores e eles existem.

Murilo Amêndola

unread,
Feb 28, 2012, 2:08:27 PM2/28/12
to caelum-...@googlegroups.com
Oi José, tudo bem?

Tente converter essa lista para um array antes de serializar. 

Muito provavelmente você está utilizando uma lista encadeada onde as posições posteriores ao indice que está analisando são apenas referências para a posição de memória onde o próximo item da lista está armazenado.

abração

--
You received this message because you are subscribed to the Google Groups "caelum-vraptor" group.
To post to this group, send email to caelum-...@googlegroups.com.
To unsubscribe from this group, send email to caelum-vrapto...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/caelum-vraptor?hl=en.



--
Murilo Amêndola
Email: muriloa...@gmail.com
Tel.: +55 11 6353-0183


Jose Maria de Oliveira

unread,
Feb 28, 2012, 2:12:51 PM2/28/12
to caelum-...@googlegroups.com

Tudo bem Murilo?

 

Vou converter .

 

Obrigado.

 

Abs.

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

Lucas Cavalcanti

unread,
Feb 28, 2012, 3:21:30 PM2/28/12
to caelum-...@googlegroups.com

Jose Maria de Oliveira

unread,
Feb 29, 2012, 6:57:52 AM2/29/12
to caelum-...@googlegroups.com

Bom dia Lucas,

 

Copiei o arquivo para o meu projeto e começou a dar referencia circular em vários pontos que antes não ocorria.

 

Caused by: com.thoughtworks.xstream.core.TreeMarshaller$CircularReferenceException:

 

Tem como descobrir qual o objeto que está ocorrendo o erro?

 

Obrigado.

 

Abs.

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

Jose Maria de Oliveira

unread,
Feb 29, 2012, 7:08:36 AM2/29/12
to caelum-...@googlegroups.com

Lucas creio que o problema seja o seguinte. Meu código é este:

 

result.use(GovExtJson.class)

                .from(features)

                .exclude("userInstall")

                .exclude("installDate")

                .exclude("batchControl")

                .exclude("license")

                .exclude("settings")

                .exclude("resources")

                .exclude("menus.feature")

                .serialize();

 

 

O GovExtJson extende de DefaultExtJson.

 

Na lista de features cada item tem uma lista de menus. Preciso do menu, mas não do relacionamento com a feature e para não dar o erro de referencia circular, exclui, .exclude(“menus.feature”).

 

Na versão anterior estava funcionando mas nesta que copiei, parece que está desprezando o código acima.

 

Abs.

 

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

Lucas Cavalcanti

unread,
Feb 29, 2012, 8:56:24 AM2/29/12
to caelum-...@googlegroups.com
tenta fazer o seguinte então:

nesse código:

public ExtJSJson serialize() {
        serializer.from(wrapper).recursive().serialize();
        return this;
    }

tire o recursive();



e na hora de dar os includes, comece com "data."

2012/2/29 Jose Maria de Oliveira <jose.O...@eccox.com.br>

Jose Maria de Oliveira

unread,
Mar 1, 2012, 8:00:41 AM3/1/12
to caelum-...@googlegroups.com

Lucas, bom dia.

 

Retirei o recursive. Não está dando erro mas também não serializa nada.

 

---> response

Object

getAllResponseHeaders: function (){return a}

getResponseHeader: function (l){return a[l.toLowerCase()]}

request: Object

requestId: 5

responseText: "{}"

responseXML: null

status: 200

statusText: "OK"

 

Não tem nada no responseText.

 

Obrigado.

 

Abs

 

José Maria de Oliveira

Eccox Technology

Tel.: + 55 11 4133-1969

Fax: + 55 11 4133-1960

jose.o...@eccox.com.br

www.eccox.com.br

Al. Rio Negro, 433, 4º andar, Edifício I

Alphaville, São Paulo, Brasil - CEP: 06454-904

 

"Seus negócios, disponíveis a qualquer momento, em qualquer lugar"

 

Lucas Cavalcanti

unread,
Mar 1, 2012, 8:50:58 AM3/1/12
to caelum-...@googlegroups.com
coloca um include("data") logo depois de criar o serializer, no construtor da classe

2012/3/1 Jose Maria de Oliveira <jose.O...@eccox.com.br>

Jose Maria de Oliveira

unread,
Mar 1, 2012, 9:01:39 AM3/1/12
to caelum-...@googlegroups.com

Lucas, inclui a linha include(“data”):

    public DefaultExtJson(HttpServletResponse response, TypeNameExtractor extractor, ProxyInitializer initializer)

        throws IOException {

        xstream = new XStream(new JsonHierarchicalStreamDriver() {

            @Override

            public HierarchicalStreamWriter createWriter(Writer writer) {

                return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE) {

                    @Override

                    public void addAttribute(String key, String value) {

                        if (!key.equals("class")) {

                            super.addAttribute(key, value);

                        }

                    }

                };

            }

        });

        xstream.setMode(XStream.NO_REFERENCES);

        xstream.aliasField("data", ExtJSWrapper.class, "list");

        serializer = new XStreamSerializer(xstream, response.getWriter(), extractor, initializer);

        include("data");

    }

 

 

 

 

Gerou este erro:

Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.eccox.gov.component.DefaultExtJson]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Field path data doesn't exist

      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)

      ... 69 more

Caused by: java.lang.IllegalArgumentException: Field path data doesn't exist

      at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.include(XStreamSerializer.java:221)

      at br.com.eccox.gov.component.DefaultExtJson.include(DefaultExtJson.java:85)

      at br.com.eccox.gov.component.DefaultExtJson.<init>(DefaultExtJson.java:70)

      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

      at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126)

      ... 71 more

Lucas Cavalcanti

unread,
Mar 1, 2012, 9:04:35 AM3/1/12
to caelum-...@googlegroups.com
Desculpe, tenta no método from:


public ExtJSJson from(Object object) {
        wrapper = new ExtJSWrapper(object);
        serializer.from(wrapper).include("data");
        return this;
    }

se não funcionar, coloca lá no método serialize mesmo:




public ExtJSJson serialize() {
        serializer.from(wrapper).include("data").serialize();
        return this;
    }

Jose Maria de Oliveira

unread,
Mar 1, 2012, 9:15:46 AM3/1/12
to caelum-...@googlegroups.com

    public ExtJSJson from(Object object) {

        wrapper = new ExtJSWrapper(object);

        serializer.from(object).include("data");

        return this;

    }

 

 

Ainda continua com o erro que não encontrou o “data”.

 

Obrigado

Lucas Cavalcanti

unread,
Mar 1, 2012, 9:23:44 AM3/1/12
to caelum-...@googlegroups.com
sim, pq a data não está no object, e sim no wrapper... precisaria trocar o from também
Reply all
Reply to author
Forward
0 new messages