Injeção de Double nos parametros no vraptor [resolvido]

Funcionou sim.

Digamos que o VRaptor use essa classe pra fazer a conversao do String 1,99 que eu envio para setar o produto.setPreco(Double preco)

@Convert(Double.class)
@ApplicationScoped
public class DoubleConverter implements Converter {

public Double convert(String value, Class<? extends Double> type, ResourceBundle bundle) {  
    if (value == null || value.equals("")) {  
        return null;  
    }  
    try {  
        return Double.valueOf(value.replace(',', '.');  
    } catch (NumberFormatException e) {  
        throw new ConversionError(MessageFormat.format(bundle.getString("is_not_a_valid_number"), value));  
    }  
}  

}

Mas digamos que tenha ocorrido um erro com outro input (não esse do double). Então o VRaptor vai repopular o meu form com o valor 1.99

O que eu quero é implementar um metodo double to string que o VRaptor use para repopular o meu form. Não quero que o VRaptor repopule o
meu form com 1.99. Sei que tem algo parecido no JSF, queria saber se tem no VRaptor.

o vraptor não vai fazer o double to string… ele vai passar como double. quem faz o to string é o jsp. E vc muda isso usando o <fmt:formatNumber

O que você pode fazer é usar ${param[‘nomedapropriedade’]}.

Porém como o Lucas falou, o VRaptor apenas faz parser do valor como String para Double. O inverso é de responsabilidade da view, sendo assim somente com a tag fmt:formatNumber.

A propósito, o VRaptor não popula o teu form, quem popula é a view (JSP).

Tá certo. Valeu pela ajuda!

To tendo um problema aqui com o conversor @Convert(Double.class) que eu informei acima, pois o vraptor não o está chamando.
Engraçado que eu inseri um println para verificacao e, no redeploy do tomcat, o vraptor o reconheceu. Mas quando eu dou shut down
no tomcat e dou um start novamente, o vraptor não chama o conversor.

se vc registrar os converters localizados daqui:

http://vraptor.caelum.com.br/documentacao/componentes-utilitarios-opcionais/

provavelmente vc não vai precisar usar seu próprio conversor.

em todo caso, se o seu converter não tiver o pacote br.com.caelum.vraptor.qqercoisa, ele deveria ter precedência sobre os do vraptor.

Eu havia registrado o conversor localizado br.com.caelum.vraptor.converter.l10n no meu web.xml

Quando eu removi esse registro do web.xml, o meu conversor anotado foi reconhecido.

Cara, por que que quando eu uso o conversor br.com.caelum.vraptor.converter.l10n do vraptor, ao inserir um valor numerico no meu form
do tipo 1.2, o vraptor converte isso em 12? Não deveria dar um erro se eu tento enviar 1.2 e o meu locale é do brasil?

não… no formato pt-br, o ponto é separador de milhar, então ele é só ignorado.

É, só que isso pode dar merda. Muita gente acha que 1.2 é o mesmo que 1,2. Não tem como deixar o usuário digitar 1.2, pois se não vai dar merda.

E quando não usamos o conversor br.com.caelum.vraptor.converter.l10n do vraptor, se eu inserir 1.20 o vraptor insere normalmente 1.20, mas se eu inserir 1,20 o vraptor responde com o erro is_not_a_valid_number. Se 1,20, que no formato en-US a vírgula é separador de milhar, o vraptor reclama, por que não reclama quando eu insiro 1.20, que no brasil é separador de milhar?

o conversor padrão usa Double.parseDouble… o l10n usa o NumberFormat, são jeitos diferentes.

o number format aceita bem mais números diferentes…

vc pode criar seu próprio conversor baseado nesse link acima, e trocando ponto por vírgula, se não tiver vírgula.
ou normalizar via javascript

Foi o que eu fiz, criei um conversor que retorna um erro se for inserido um valor com ponto. É que achei estranho porque se eu não implementar esse conversor, e confiar no javascript, basta alguém desabilitar javascript e inserir 1.12 que será inserido no banco 112 sem quaisquers problemas.

A propósito Lucas, quando o meu conversor gera um erro, tem como eu não entrar no método do controler, mas sim ir direto de volta para a página do form? Digo isso pois mesmo o meu conversor gerando o erro, o metodo do controler é acionado, e o validator dentro desse metodo verifica que o parametro não está preenchido e acrescenta o erro “nao.pode.ser.nulo” por exemplo.

Até o momento eu corrigi fazendo assim dentro do método do controller:

validator.onErrorUsePageOf(this).formulario();

restante do código

a forma de corrigir é colocando esse validator.onErrorXXX mesmo.

não existe um jeito garantido de voltar pra última página. Existe o header referer, mas nem sempre os browsers mandam.

Beleza então. Valeu pela paciência! abs!