Perguntas vraptor 3

7 respostas
jvlouvem

Oi Pessoal,

Sou um grande fã do VRaptor, utilizei a versão 2 por mais de um ano

Estou criando um projeto simples para me familiarizar com a versão 3

Perguntas:

1 - Como o VRaptor já possui internamente o Spring, ao usar @Component nas minhas classes DAO, vou precisar anotar os metodos com @Transactional(propagation=Propagation.REQUIRED) ou o VRaptor já faz isso implicitamente, bastando configurar ?

2 - Uso envio de emails pelo Spring, nesse caso tenho que definir o appplicationContext.xml e definir um CustomProvider, certo ?

3 - Uma coisa que gostava bastante e saiu desta versão foi a anotação @Out, antes eu tinha por exemplo duas variaveis e bastava fazer uma atribuição em qualquer metodo, agora tenho que usar uma string dentro de result.include(“meuObjeto”, meuObjeto); em cada metodo que eu preciso, voltamos ao request.setAttribute :-(. Gostava do @Out, dava menos margem a erros e o reuso era maior. Tem como usar ainda na versão 3 ou só alterando o código fonte ?

Feliz natal a todos !

7 Respostas

Lucas_Cavalcanti

olá,

o VRaptor consegue se integrar com qualquer componente do Spring, mas não tem nenhum configurado por padrão (só o DI)
então vc ainda precisa configurar o transactional no applicationContext.xml e usar o @Transactional

você só precisa do applicationContext.xml no classpath

O problema de usar o @Out é que vc precisa criar um field para cada objeto que vc quer disponibilizar pra view e sua classe acaba ficando com fields demais.
com o result.include você tem um controle maior do que vai ou não pra requisição.
Se for só um objeto, você pode usar o retorno do método para disponibilizar para a view.

De qqer forma dá pra implementar o suporte ao @Out razoavelmente fácil (com um interceptor e a anotação):

estou usando nisso uma feature que não foi lançada ainda (before e after no interceptor), então use o último snapshot:

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.2.1-SNAPSHOT/vraptor-3.2.1-20101222.144352-9.jar

Feliz natal =)

jvlouvem

Perfeito Lucas !
Excelentes respostas, nem tenho o que acrescentar, valeu mesmo

Abração :wink:

jvlouvem

Oi Lucas,

cara a versão 3 nem precisa mais declarar @InterceptedBy no controlador, achei fantastico, hehe
Era essa pergunta que eu ia fazer, queria saber qual classe interceptar, então a pergunta não tem mais sentido… :smiley:

Vamos lá a mais um pedido de help

Bom eu estou quase lá para usar a anotação @Out

A unica coisa que não está dando certo é a reflection dos campos.

Tenho um campo String anotado com @Out, mas a lista abaixo sempre vem vazia

List<Field> fields = new Mirror().on(ResourceMethod.class).reflectAll().fields();

Já conferi o ResourceMethod e está trazendo o valor correto, ou seja, está trazendo o metodo invocado na URI

OBS: Não sei se fiz o import correto da classe Mirror, importei de net.vidageek.mirror.dsl

jvlouvem

Funcionou,

não tinha reparado que estava passando para o Mirror a referencia do metodo (ResourceMethod.class) e não a referencia do controlador (argumento Object do interceptor)

Lucas, desculpa a ansiedade em postar :oops:

Lucas_Cavalcanti

Legal que funcionou =)

qualquer dúvida dá um toque

Abraços

jvlouvem

Oi Lucas,

Fiquei até agora tentando resolver e nada :frowning:

Bom, na verdade não funcionou 100%, a annotation fez o que tinha que fazer, injetou os fields no Result.

Só que tem um porém…

1 - O metodo é chamado pela URI e ao final dele tenho

2 - O Interceptor é chamado em seguida e coloca os fields no Result

Feito o passo 2, os fields são perdidos porque a forward já aconteceu antes e o response já está commitado…

Estava pensando em algo mais ou menos assim:

em vez de:

Alterar para:

É por ai ou não ?

Abração cara

Lucas_Cavalcanti

não existe uma classe que intercepta o forward…

qdo vc faz o result.forwardTo ele já faz o forward de verdade…

vc teria que sobrescrever o Result também, e fazer as outjections antes do forward… seria algo assim:

@Component
public class CustomResult extends DefaultResult {

    //delega o construtor

   @Override
   public <T> T forwardTo(Class<T> controller) {
        fazOOutject();
        return super.forwardTo(controller);
   }

}

o problema é que esse fazOOutject() não vai ser mto simples nesse ponto (é bem mais fácil no interceptor).

basicamente é o seguinte:

  • receber um Container no construtor do CustomResult
  • fazer um container.instanceFor(OutjectInterceptor.class);
  • fazer um container.instanceFor(MethodInfo.class);
  • fazer um container.instanceFor(methodInfo.getResourceMethod().getResource().getType()); //isso retorna a instância do controller
    -chamar interceptor.intercept(stack, methodInfo.getResourceMethod(), controller); passando uma stack falsa. Ou extrair a lógica de outjection para um método público no interceptor que não dependa da stack e chamá-lo.

meio complicado, mas isso resolveria, acho.
se não conseguir a partir disso, ou se tiver alguma dúvida dá um toque

[]'s

Criado 22 de dezembro de 2010
Ultima resposta 6 de jan. de 2011
Respostas 7
Participantes 2