Problemas com valor monetário no VRaptor

16 respostas
skylinedu

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

16 Respostas

Guevara

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!

G

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>

skylinedu

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.

G

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

R

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?

Lucas_Cavalcanti

os nomes estão corretos?

dá algum erro no servidor?

R

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

R

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"/>"/>
R

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;
    }
Lucas_Cavalcanti

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

R

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

G

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)

R

Apache Tomcat 6.0.20!

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

G

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?

donny

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?

G

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

Criado 25 de maio de 2010
Ultima resposta 13 de set. de 2011
Respostas 16
Participantes 6