VRaptor - Popular modelo via construtor somente

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!!

Ninguém?

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.

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.

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.

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

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:

Te beleza Lucas. Vou tentar :wink:

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

valeu! Qualquer coisa dá um toque! =)

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

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.

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