Vraptor3: problemas ao injetar double

Tenho um JSP bem simples basicamente com propriedades assim:

<input type="text" name="scorecard.green.min" value="5,00" /> <input type="text" name="scorecard.green.max" value="19,00" /> <input type="text" name="scorecard.green.description" value="blah" />

Criei esses campos como Double wrapper, e no meu método do controller tenho assim:

public void store(Scorecard scorecard) { [...] }

E o converter:

[code] public Double convert(String value, Class<? extends Double> type, ResourceBundle bundle) {
if (value == null || value.trim().length() == 0) {
return null;
}

    try {
        return (Double) NumberFormat.getInstance(Locale.FRANCE).parse(value);
    } catch (ParseException e) {
        throw new ConversionError(e.getMessage());
    }
}[/code]

Fazendo um debug noto que passa pelo converter, porém quando faço um debug no controler os valores em double estão nulos, porém o campo description, que é string, está populado.

Pois é… coisas que a gente passa quando decide fazer as coisas sem ler a API.

Conforme a API diz o retorno de NumberFormat.parse é um Number, logo ele pode ser Long ou Double, Float… Nesse caso como o valor passado era 150,00 o retorno era um Long. Assim a conversão falhava, já que era esperado um Double e não um Long.

Porém estou com uma dúvida. No meu console não foi exibida nenhuma exception, nem mesmo algum warning do vraptor. Apenas os valores não foram injetados causando um erro de validação no Bean Validator.

os erros de conversão são adicionados como erros de validação (teoricamente)

Mas assim eu teria que sempre ter um validator e ficar verificando se tem mensagens?

O problema disso que o pojo chega pelado, com tudo null e eu nem sequer fico sabendo o que aconteceu. Até hoje não entendi muito bem como o vraptor trata essa coisa de validação, erros, exceptions e mensagens.

ele nao chega todo pelado… só nao popula os campos que deram erro de conversao…

teoricamente vc deveria prevenir esses erros na sua jsp, usando validaçao javascript, por exemplo…

ele passa null pra vc poder se recuperar… tanto que se ao final do método vc nao chamar o validator.onErrorUse vai dar uma exception…

Lucas, você tem razão.

Lembrei do JSF, que simplesmente estoura a tela e você nem sequer consegue fazer nada, nem saber qual o campo certo. Pelo menos dessa forma, apesar de inicialmente eu achar estranha, você consegue facilitar (e muito) a vida do desenvolvedor, permitindo uma forma simples de recuperar o erro.

Porém uma sugestão que eu dou é de deixar um warning no logger informando o porque de não conseguir injetar o valor, assim dá para entender melhor o que aconteceu.

E como eu faço para ler isso? Os erros são jogados no validator? Basta eu mandar imprimir o {error}?

isso… os erros são adicionados no validator… e vc consegue imprimir na view se vc fizer o validator.onErrorUse dentro da lógica

Ressuscitando o tópico, seria interessante colocar algum log.warn pelo menos para mostrar os erros de validação, mesmo que eles sejam adicionados na validação.

garcia, cria uma issue no github por favor?

http://github.com/caelum/vraptor/issues/issue/208 :thumbup:

valeu =)