Problemas com valor monetário no VRaptor

E ea pessoal,

estou com um problema com um campo de valor BigDecimal na hora de enviar alguma alteração, após definir o locale da página

os meus validadores geraram essa mensagem:

Resumindo, preciso que o campo aceite a vírgula da unidade monetária e converta para o ponto. Sei que o VRaptor possui um conversor para isso.

Será que alguém pode me falar o que preciso fazer.

abraços

Olá!
Se não me engano o locale é setado no web.xml para que todas as páginas fiquem iguais, têm um post recente onde o Lucas postou o código, mas eu uso taglib mesmo para mostrar valores em BigDecimal e datas:
Para mostrar BigDecimal na JSP:

<fmt:formatNumber value="${cheque.valor}" minFractionDigits="2" type="currency"/>

Este é o import:

<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 

Para datas:

<fmt:formatDate value="${cheque.dtInclusao }" pattern="dd/MM/yyyy" />

Abraço!

skylinedu, na última versão do vraptor contribuí com um código para usar converters localizados. Porém para ativar os componentes você precisa fazer manual no seu web.xml.

<context-param> <param-name>br.com.caelum.vraptor.packages</param-name> <param-value>br.com.caelum.vraptor.converter.l10n</param-value> </context-param>

Além disso configure o locale no seu web.xml:

<context-param> <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name> <param-value>pt_BR</param-value> </context-param>

Guevara utilizo também as tags do JSTL para formação dos dados. Mas minha dúvida era de como converter a vírgulo do sistema monetário brasileiro para o ponto. Fico grato pela ajuda.

garcia-jj sua contribuição será bastante utilizada, creio que utilizar BigDecimal para campos de valores monetários é importante já que detalhes de arredondamento são melhores. Fico agradecido pela ajuda e parabéns pelo código fornecido para o VRaptor.

Um projeto que desenvolvi há algum tempo, que são indicadores de produtividade, eu usei double. Os valores são todos percentuais com apenas duas casas decimais (exemplo 50,13%) e como não é feito nenhum calculo, apenas exibição dos dados, não tive problemas.

Já em outro projeto, que é um sistema eletrônico de cobrança, usei BigDecimal porque alguns calculos não necessários. Embora todos os dados são com apenas duas casas decimais, preferi usar BigDecimal por envolver calculos financeiros.

Abraços

Garcia fiz o esquema que vc falou!

Atualizei a lib do VRaptor pelo maven da 3.1.1 pra 3.1.2

coloquei no web.xml

porem o meu Double so fica com null!!!

se passo 2 = null
se passo 2,5 = null
se passo 2.5 = null

tem alguma luz ai?

os nomes estão corretos?

dá algum erro no servidor?

sim ta tudo certo

se volto pra versao 3.1.1

e mando por exemplo 5

o Double fica com 5
se passo 5.5 fica com 5.5
se passo 5,5 aai vem null

agora com o 3.1.2 vem tudo null

pom.xml

<artifactId>vraptor</artifactId>
<version>3.1.2</version>

web.xml

    <context-param>
        <param-name>br.com.caelum.vraptor.packages</param-name>
        <param-value>br.com.caelum.vraptor.converter.l10n</param-value>
    </context-param>
    <context-param>
        <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
        <param-value>pt_BR</param-value>
    </context-param>

jsp

<input type="text" id="preco" name="servico.preco" maxlength="7" size="6"
                   value="<fmt:formatNumber value="${servico.preco}" minFractionDigits="2" type="currency"/>"/>

se incluo um metodo que recebe string ele seta…

    public void setPreco(String preco) {
        System.out.println("preco: " +  preco);
    }

porem com esse converter deveria cair no metodo abaixo,certo?

    public void setPreco(Double preco) {
        this.preco = preco;
    }

não dá nem erro de validação? não aparece nada no log do servidor?

Nao da erro nenhum lucas…

Habilitei o log do vraptor mais nada…

foi o que eu falei, na hora de fazer o setPreco, ele cai no metodo que recebe String e nao Double

Eu havia aberto uma issue no github para deixar um pouco mais explicado quando há um erro de conversão. Atualmente não há log para indicar que o valor não pode ser “parseado” corretamente. Deveria ou lançar uma exception ou exibir um warning, facilitando a detecção do erro e o motivo do valor não poder ter sido injetado.3

Wherever… qual o appserver que você está usando? E você declarou o seu atributo como primitivo ou wrapper? Localized converters funcionam apenas com wrappers 8)

Apache Tomcat 6.0.20!

classe Double… por isso retorna null, quando nao ha conversao

Ahh, mas perae…

<input type="text" id="preco" name="servico.preco" maxlength="7" size="6" value="<fmt:formatNumber value="${servico.preco}" minFractionDigits="2" type="currency"/>"/>

Você tem isso aqui no seu código, certo? Com o type=currency ele escreve o R$ junto ao valor, e o vraptor não trata isso. Na verdade o vraptor trata valores BigDecimal, Double ou Float, mas não money.

Você está enviando com o R$ junto?

Também estou tendo esse mesmo problema. Estou usando:

&lt;fmt:formatNumber value="${cheque.valor}" minFractionDigits="2" type="currency"/&gt;  

No input text mostrar o valor assim: R$ 150,50. Porém ao submeter, no controller o VRaptor deixa o cheque.valor = null;

Como posso resolver isso?

Remova o R$ ou então sobrecreva o converter para que aceite o R$