[RESOLVIDO] Vraptor 3 - Tratamento de tipo de objeto da view

acho q ele não tá passando pelos converters… tenta colocar um breakpoint ou um log no seu converter e vê se ele está sendo chamado…

pode ser que seja um problema com a ordem q o VRaptor tá registrando os converters…
vc tá usando q versão do VRaptor? que provider?

[quote=Lucas Cavalcanti]acho q ele não tá passando pelos converters… tenta colocar um breakpoint ou um log no seu converter e vê se ele está sendo chamado…

pode ser que seja um problema com a ordem q o VRaptor tá registrando os converters…
vc tá usando q versão do VRaptor? que provider?[/quote]

Ele não está passando pelo converters… vão direto para o hibernate validator… Estou usando versão 3.1

parece ser um bug então =(

no log de debug aparece um :

applying produto.valor with [1,1]

?

[quote=Lucas Cavalcanti]parece ser um bug então =(

no log de debug aparece um :

applying produto.valor with [1,1]

?[/quote]
Aparece sim.
Atualizei para a versão 3.2
Está aparecendo no log entre os applying.

18:27:00,594 DEBUG [VRaptorApplicationContext] Cache miss for class br.com.caelum.vraptor.converter.PrimitiveIntConverter
18:27:00,587 DEBUG [VRaptorApplicationContext] Cache miss for class br.com.caelum.vraptor.converter.PrimitiveDoubleConverter

Porem não valida.

bom, o workaround pra agora seria transformar o produto.setValor(Double) pra produto.setValor(String) e converter na mão dentro do setter…

abri um bug pra investigar o que está acontecendo

Lucas, eu notei esse erro atualizando para a versão 3.2. Fiz um debug e os converters opcionais não estão sendo chamados, porém esse erro acontece apenas quando usamos o guice. No Spring não há esse erro.

cleison, vc tá usando o guice?

garcia, coloca isso lá na issue do bug, por favor?

[quote=Lucas Cavalcanti]cleison, vc tá usando o guice?

garcia, coloca isso lá na issue do bug, por favor?[/quote]

Não estou usando não.

Desculpa uma duvida…como ficaria a aplicação do Guice e do Spring?

cleison, qual o provider você está usando? Ou pelo menos você pode nos dizer se você tem os jars guice-snapshot, spring-xxx ou pico-xx?

Lucas, em um teste em uma aplicação minha notei que os converters não estavam sendo registrados. Quando voltei para o Spring tudo voltou a funcionar. Vou fazer mais uns testes para ver o que está acontecendo.

Abraços

[quote=garcia-jj]cleison, qual o provider você está usando? Ou pelo menos você pode nos dizer se você tem os jars guice-snapshot, spring-xxx ou pico-xx?

Lucas, em um teste em uma aplicação minha notei que os converters não estavam sendo registrados. Quando voltei para o Spring tudo voltou a funcionar. Vou fazer mais uns testes para ver o que está acontecendo.

Abraços[/quote]

Tenho os jars do spring e picocontainer. O spring…tem que configurar alguma coisa no web.xml

não precisa configurar nada a mais no web.xml…
mas tire os jars do picocontainer

[quote=Lucas Cavalcanti]não precisa configurar nada a mais no web.xml…
mas tire os jars do picocontainer[/quote]
Lucas retirei persiste o problema…tem mais algum jar que não pode está na lib?

trocar o setter pra string funcionou?

class Produto {
 
   public void setValor(String valor) {
        //codigo q tava no converter
   }
}

[quote=Lucas Cavalcanti]trocar o setter pra string funcionou?

[code]
class Produto {

public void setValor(String valor) {
//codigo q tava no converter
}
}
[/code][/quote]
Funciona sim. Se mandar Double com ponto tambem adiciona normal.
Tenha algum outra forma de converter?

uma sugestão:
crie uma classe que representa valores em dinheiro.

usar double é a pior coisa que vc pode fazer, por causa dos erros de arredondamento.

crie a classe:

@Embeddable
public class Moeda {

    private BigDecimal valor;
    
    private Moeda() {} //pro hibernate não reclamar

    private Moeda(String value) {
         this.valor = BigDecimal.valueOf(value);
    }
}

no Produto é só trocar o valor pra ser do tipo Moeda, e mudar os getters/setters, q o hibernate vai saber se virar

mude aquele converter de double pra ser um converter de Moeda, e usar o construtor pra criar a moeda.

futuramente vc pode colocar as operações de moeda nessa classe, bem como impressões formatadas e coisas do tipo

que acha?

[quote=Lucas Cavalcanti]uma sugestão:
crie uma classe que representa valores em dinheiro.

usar double é a pior coisa que vc pode fazer, por causa dos erros de arredondamento.

crie a classe:

@Embeddable
public class Moeda {

    private BigDecimal valor;
    
    private Moeda() {} //pro hibernate não reclamar

    private Moeda(String value) {
         this.valor = BigDecimal.valueOf(value);
    }
}

no Produto é só trocar o valor pra ser do tipo Moeda, e mudar os getters/setters, q o hibernate vai saber se virar

mude aquele converter de double pra ser um converter de Moeda, e usar o construtor pra criar a moeda.

futuramente vc pode colocar as operações de moeda nessa classe, bem como impressões formatadas e coisas do tipo

que acha?[/quote]
Mas se os converters não estão funcionando, desta forma tambem não irá… vou usar também objetos que receberá peso.
O que podemos fazer ainda… para tentar funcionar converters?

o que não tá funcionando é ter mais de um converter pra mesma coisa… o VRaptor já tem um converter pra Double, e vc tava registrando outro…

se vc registrar um converter pra Moeda vai funcionar

Ufa!!! funcionou da seguinte forma:
l10n no web.xml e na classe o objeto como BigDecimal. Como double não funfa, mas ja resolve meu caso…brigadão

Deixe-me entender… no seu web.xml está com o package scan para br.com.caelum.vraptor.converter.l10n, e usando double não funciona, BigDecimal sim?

O double que voce usava era o primitivo (double minusculo) ou objeto (Double com D maiusculo)?

[quote=garcia-jj]Deixe-me entender… no seu web.xml está com o package scan para br.com.caelum.vraptor.converter.l10n, e usando double não funciona, BigDecimal sim?

O double que voce usava era o primitivo (double minusculo) ou objeto (Double com D maiusculo)?[/quote]

Isso mesmo Garcia… uma correção double primitivo não funfa o objeto sim (Double).

Uma outra duvida para tratar o ponto da mascara para valores inteiros ex 1.000.

Foi incrementado alguma coisa no vraptor