VRaptor - Popular modelo via construtor somente

12 respostas
ThiagoInGuj

Bom dia!

Tem algum modo de eu dizer ao VRaptor para somente popular o meu modelo pelo construtor?

É porque o meu modelo possui vários setters que eu não quero que sejam populados via parameter injection e
o VRaptor permite isso, pois ele popula tanto pelo Construtor quanto pelos setters, ao mesmo tempo.

Preciso dos setters pois o hibernate tem uma feature chata que se eu não expor os getters e setters, ao fazer
getId() em meu modelo detached ele vai tentar acessar o banco.

Alguém ajuda? Abraços!!

12 Respostas

ThiagoInGuj

Ninguém?

Lucas_Cavalcanti

se você usa o IOGI ele vai popular o objeto pelo construtor…

o Hibernate força vc usar os setters? a @Id está no atributo?

teoricamente o Hibernate não força nada disso se o @Id estiver no atributo, daí vc pode remover todos os setters dos atributos que vc não quer deixar expostos.

ThiagoInGuj

Lucas, o default do VRaptor não é usar o iogi? Eu não incluí nenhuma configuração para usá-lo pois penso que seja o default.

O hibernate tem uma feature que se você anotar o @id no field em vez de no accessor ele irá realizar uma consulta no banco
caso você faça modelo.getId(). Por isso eu tive que anotar o @id no accessor e para isso precisei dos benditos getters and setters
pois anotando no accessor o hibernate procurará pelas anotacoes nesses accessors e nao nos fields…

Enfim, eu fucei um pouco na web e vi que tem como fazer com que o @id seja colocado no field e o lazy load não ocorra, vou corrigir
o meu modelo. Mas de todo modo, eu ainda terei algum setter no meu modelo, que eu vou usar dentro da minha aplicação, e eis a questão:

Digamos que eu envio os parametros x,y,z,w, e no meu modelo eu tenho o construtor para x,y e z. O iogi irá popular os parametros enviados
no construtor x,y,z, e também vai popular os parametros excedentes, no caso o w, via setter. É aqui que eu não queria que isso acontecesse.

Lucas_Cavalcanti

Tem como fazer isso, mas vc precisa sobrescrever algumas classes, do jeito que tá a implementação agora…

to falando com o dono do IOGI, pra ver se tem um jeito mais fácil do que o que eu to pensando.

A opção pra usar ou não os setters está separada, mas está numa classe interna do IOGI que vc precisaria mudar.

ThiagoInGuj

Tem algum caminho das pedras em mente? Qual é a classe a sobrescrever?

Lucas_Cavalcanti

vc precisa criar uma classe igual a essa:

e modificar o ObjectInstantiator na linha 62

por uma cópia dessa classe:

que ao invés de chamar o método valueWithPropertiesSet() da linha 35

chama o método value();

Se você puder, tenta extrair isso pra um método protected pra ficar fácil de sobrescrever e manda um pull request pro vraptor, por favor =)

se não, abra uma issue pra fazer isso, por favor:

ThiagoInGuj

Te beleza Lucas. Vou tentar :wink:

ThiagoInGuj

A issue está criada. Só falta tentar resolver isso. rs

Lucas_Cavalcanti

valeu! Qualquer coisa dá um toque! =)

G

O Iogi deveria usar somente o construtor se ele satisfazer os parametros. No seu caso, você tem tal construtor?

ThiagoInGuj

garcia, é exatamente isso. Se eu tenho o construtor que satisfaz os parametros, o iogi vai popular usando esse construtor e, depois, os parametros restantes ele vai popular via setter.

O correto seria ele popular pelo construtor ou pelo setter, mas não popular pelo construtor e entao popular o restante via setter. Isso me permitiria enviar parametros extras para tentar
realizar um parameter injection.

Lucas_Cavalcanti

OU vc pode não expôr os setters dos parâmetros que vc não quer que sejam setados :wink:

Criado 20 de fevereiro de 2013
Ultima resposta 27 de jun. de 2013
Respostas 12
Participantes 3