IOGI - Usando objetos imutáveis junto com o VRaptor

Olá pessoal…

algumas pessoas me perguntaram como fazer para não usar setters nos parâmetros dos métodos, ou seja, objetos imutáveis…

para isso temos um projeto (ainda em beta) chamado IOGI que consegue instanciar os objetos a partir de parâmetros do construtor…

por exemplo, se vc tem uma classe imutável:

public class Carro {
    private final String cor;
    private final String modelo;

    public Carro(String cor, String modelo) {
        this.cor = cor;
        this.modelo = modelo;
    }
    //getters
}

e a recebe como parâmetro de uma lógica:

public void lava(Carro carro) {...}

vc consegue popular esse carro usando os parametros carro.cor e carro.modelo…

para isso funcionar, vc precisa colocar o jar do iogi no seu WEB-INF/lib (está em lib/optional do zip do vraptor)
criar a classe:

public class CustomProvider extends SpringProvider { // ou HibernateCustomProvider, ou JPACustomProvider
	@Override
	protected void registerCustomComponents(ComponentRegistry registry) {
		super.registerCustomComponents(registry);
		registry.register(ParametersProvider.class, IogiParametersProvider.class);
		registry.register(Instantiator.class, VRaptorInstantiator.class);
	}
}

e colocar no seu web.xml (talvez substituindo o existente):

<context-param>
	<param-name>br.com.caelum.vraptor.provider</param-name>
	<param-value>br.com.seu.pacote.CustomProvider</param-value>
</context-param>

assim, além de ganhar a imutabilidade dos objetos, vc ainda consegue receber qqer componente
no construtor dos seus modelos (por exemplo receber seu dao/repository)…

Em todo caso, esse projeto (iogi) ainda é beta, e ainda tem alguns bugs, que a gente ficaria bastante
felizes se vcs encontrassem :wink:

Abraços

Lucas,

Se eu entendi direito então o IOGI procura primeiro popular o objeto via construtor, caso não encontre um construtor valido (de acordo com os nomes dos atributos) ele tenta popular o objeto via setters, é isso?

[quote=rponte]Lucas,

Se eu entendi direito então o IOGI procura primeiro popular o objeto via construtor, caso não encontre um construtor valido (de acordo com os nomes dos atributos) ele tenta popular o objeto via setters, é isso?[/quote]

exato

[quote=Lucas Cavalcanti][quote=rponte]Lucas,

Se eu entendi direito então o IOGI procura primeiro popular o objeto via construtor, caso não encontre um construtor valido (de acordo com os nomes dos atributos) ele tenta popular o objeto via setters, é isso?[/quote]

exato[/quote]

Bacana!!!

E nos casos de meus objetos imutáveis receberem outros objetos imutáveis ou mesmo objetos complexos (diferentes de primitivos e wrappers)?

a regra é aplicada recursivamente…
do mesmo jeito que acontecia com os setters

[quote=Lucas Cavalcanti]a regra é aplicada recursivamente…
do mesmo jeito que acontecia com os setters[/quote]

Pretty nice! Parabéns! :smiley:

a cada dia que passa fico mais impressionado com o vraptor.

Eu não tive sucesso usando ele no Vraptor. http://www.guj.com.br/posts/list/147009.java

Sensacional!!
Esse é meu questionamento com os frameworks, principalmente do Java Efetivo.

Vou Testar!

é pq vc caiu num dos bugs :wink:

se alguem achar outro bug (e for fácil de reproduzir e resolver) eu já corrijo e gero um snapshot com a correção…

[quote=Lucas Cavalcanti]Olá pessoal…

algumas pessoas me perguntaram como fazer para não usar setters nos parâmetros dos métodos, ou seja, objetos imutáveis…

para isso temos um projeto (ainda em beta) chamado IOGI que consegue instanciar os objetos a partir de parâmetros do construtor…

por exemplo, se vc tem uma classe imutável:
.
.[/quote]Oi, Lucas
Este recurso é simplemente fantástico!! :mrgreen:
Só 1 duvidinha: é possível usar o IOGI junto c/ o Provider p/ JPA, digo ambos simultaneamento no mesmo Projeto(App)??!

sim, eh soh trocar o extends SpringProvider por extends JPACustomProvider…

vamos fazer um jeito mais fácil de registrar isso, pra não precisar criar classes a mais…

[]'s

BTW, aparentemente esse seu bug já foi corrigido há algum tempo (tipo desde janeiro :wink: )

BTW, aparentemente esse seu bug já foi corrigido há algum tempo (tipo desde janeiro :wink: ) [/quote]

Mas que beleza. Assim que passar a correria vou fazer uns testes e reportar algum erro.

Abraços

Estive usando iogi em um dos meus projetos que usam vraptor. Aparentemente tudo ok.

Porém pesquisei um pouco sobre o projeto e achei quase nada sobre ele. Há somente a página do projeto no github com uma descrição bem sucinta. Me parece um bom projeto, mas sem uma boa documentação é complicado usar.

Assim problemas que eu tiver terá de ser na base da investigação ou tentativa-e-erro. É complicado usar isso para projetos grandes.

o dono do Iogi está mexendo nele ultimamente, vou falar pra ele colocar uma página de docs…

Boa noite!

Estou usando o VRaptor 3.4.1 e configurei o web.xml para usar o iogi.

Estou tentando usar imutabilidade em um modelo meu mas a questão é a seguinte:

Eu anoto a propriedade como final e crio o construtor passando os argumentos. Ocorre que nesse construtor também existem propriedades
que não são final.

Quando eu não crio o construtor sem argumentos, o VRaptor não consegue instanciar o meu modelo. Quando eu crio o construtor sem argumentos,
o VRaptor chama esse construtor e não o construtor com argumentos.

Alguém ajuda?

se o construtor tiver alguma propriedade que não veio na requisição o iogi não vai usar esse construtor. Se tá no construtor tem que estar no request.

Entendi Lucas. Pois é, no meu construtor existem mais propriedades que no request. Eu achava que o iogi
preencheria com null esses parametros extras do construtor que não existem no request. Valeu!!

Lucas, não seria melhor se o iogi pudesse popular os parâmetros diretamente nos atributos?