Problema com conversor de Boolean no VRaptor 3

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 :slight_smile:

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 :slight_smile:

feito