Olá,
Estou enfrentando um pequeno problema com o VRaptor 3. Tenho uma interface em meu sistema que é utilizada para filtrar alguns resultados. Um dos campos da minha entidade é do tipo Boolean, então achei por bem utilizar um Boolean na minha lógica. Porém, há casos que não desejo passar nenhum valor (não irei filtrar por esse campo), e esperava receber um null na minha lógica, e de fato é isso que eu recebo. Apesar disso, ocorre uma exceção na conversão do Boolean e recebo a seguinte mensagem na tela (junto com um stacktrace), ao invés de ser redirecionado para a view:
There are validation errors and you forgot to specify where to go. Please add in your method something like:
validator.onErrorUse(page()).of(AnyController.class).anyMethod();
or any view that you like.
Após debugar, pude observar que o BooleanConverter lança uma exceção, porém esse comportamento de transformar a exceção em um erro de validação um tanto problemático, visto que se não estivermos utilizando o validator na lógica é muito improvável que exista um “validator.onErrorUse()”. O problema maior é que demora um pouco até cair a ficha de qual é exatamente o problema, visto que a exceçao não tem nada a ver com o problema, e pior, debugando a lógica ela executa normalmente (!!), só falhando o dispatch para a view, devido ao erro não tratado.
Um ponto que observei é que o Converter do tipo primitivo boolean retorna falso caso o parâmetro seja nulo ou “”, porém no caso do Boolean null retornaria null, enquanto “” lança um ConversionError. No caso de um na view, não é possível obter um null (sem recorrer a manipulação de Javascript), mas utilizar um Selecione é muito comum, sendo inclusive reconhecido por várias bibliotecas como campo não preenchido. Não seria interessante fazer o “” também returnar null no caso do BooleanConverter, a fim de simplificar a vida de que utiliza a campos Boolean em e manter coerência com o PrimitiveBooleanConverter?
T+
Olá Duron,
concordo com você que o booleanConverter deveria colocar null quando vem vazio…
mas não concordo que não dê erro de validação… Quando dá erro de conversão, precisamos mostrar isso
de algum jeito… e o jeito é criar erros de validação para não dar uma exception logo de cara. Quando existem
erros de validação e vc não fala pra onde ir dá essa exceção mesmo…
de qqer forma, vc consegue corrigir o problema facilmente criando a classe:
@Convert(Boolean.class)
@ApplicationScoped
public class MeuBooleanConverter extends BooleanConverter implements Converter<Boolean> {
public Boolean convert(String value, Class<? extends Boolean> type, ResourceBundle bundle) {
if ("".equals(value)) {
return null;
}
return super.convert(value, type, bundle);
}
}
vou corrigir isso no VRaptor, vai estar disponível na próxima versão…
[]'s
Lucas, esse converter trata apenas a wrapper ou o primitivo também? Caso tratar o primitivo tem que tomar cuidado para não tomar um null-pointer-exception por causa do autoboxing.
[edit] oops, desculpe, agora ví que tem dois converters: um para o primitivo e outro para o wrapper 
lucascs,
Agradecido!
Então, até entendo que ele deve ter uma forma de informar o usuário de que houve um erro de conversão, mas acho que usar a validação um pouco problemática por essa situação que acabou ocorrendo comigo… eu não usei o validatior nenhuma vez, e recebo um erro de que não fiz o redirecionamento da validação. Ainda que isso estivesse bem documentado, a exceção lançada não tem nada a ver com o erro que a gerou, sem fazer um debug eu nunca teria descoberto o erro. Por um lado eu concordo que deve ter uma forma de saber que houve um erro de conversão ( e nesse caso seria interessante evitar a execução da lógica), por outro utilizar o Validator pra isso me obrigaria a ter um validator.onErrorUse() em cada lógica pra evitar cair em uma tela de exceção.
T+
P.S.: Sem querer abusar da boa vontade, mas poderia ver essa thread? http://guj.com.br/posts/list/15/136307.java#786034 É um problema com o validator, na verdade uma pequena inconsistência entre a validação fluente e a clássica.
Duron, pelo que entendi você quer dizer que é estranho ter uma mensagem de erro sendo tratada como validação?
A gente não pode mudar esse comportamento por enquanto por causa da compatibilidade com versões anteriores.
Mas vou melhorar a mensagem da exception…
[]'s
lucas, nao deixe de abrir no jira pra sair no changelog do 3.0.3 