Romulinho, depois dessa discussão fui aprofundar no funcionamento do VRaptor. Vi que o interceptor dele que instancia e converte os parâmetros do request coloca os erros dentro do Validator, e mesmo que tenha dado erro de conversão a lógica do seu controller é executada.
No validador é adicionado um Message com uma category e uma message. O valor da category é o nome do parâmetro que teve erro de conversão. Então eu fiz o seguinte:
- Sobrescrevi o validador do VRaptor e criei um método “hasCategory(String)”:
@Component
@RequestScoped
public class ValidadorCustomizado extends DefaultValidator {
public ValidadorCustomizado(Result result, ValidationViewsFactory factory, Outjector outjector, Proxifier proxifier,
List<BeanValidator> beanValidators, Localization localization) {
super(result, factory, outjector, proxifier, beanValidators, localization);
}
public boolean hasCategory(String categoria) {
for (Message mensagem : getErrors()) {
if (mensagem.getCategory().equals(categoria)) {
return true;
}
}
return false;
}
}
- E na lógica executada pude verificar se houve erro para algum parâmetro:
@Resource
public class TesteController {
private final Result resultado;
private final ValidadorCustomizado validador;
public TesteController(Result resultado, ValidadorCustomizado validador) {
this.resultado = resultado;
this.validador = validador;
}
public void erroConversao(Integer numeroInvalido) {
// Aqui eu passo o nome do parâmetro para verificar se há erro nele
if (validador.hasCategory("numeroInvalido")) {
for (Message message : validador.getErrors()) {
System.out.println(message.getCategory());
// Essa mensagem é configurada no arquivo de mensagens
System.out.println(message.getMessage());
}
}
validador.onErrorRedirectTo(this).erroConversao(-99);
resultado.include("mensagem", "Número inválido => "+numeroInvalido);
}
}
Bom, sabendo disso você pode customizar um validador para melhor atender às suas necessidades. Não sei se já resolveu seu problema, mas de qualquer forma pode servir para outro também.