Erro de validação no VRaptor 3

5 respostas
anderson_lr

Pessoal,

Havia criado um post anterior sobre esse assunto mas está travando o navegador ao abrir a mensagem. Então decidi criar outro. O problema é o seguinte. Praticamente toda vez que tento persistir um objeto no banco o vraptor me mostra o seguinte erro no servidor:
Servlet.service() for servlet default threw exception br.com.caelum.vraptor.InterceptionException: 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. If you didn't add any validation error, it is possible that a conversion error

Já chequei na entidade se está passando algum campo com valo null mas está tudo certo. Alguém sabe o que pode ser?

5 Respostas

Lucas_Cavalcanti

finalzinho do erro:

pode ser um erro de conversão, tipo uma letra num campo que só aceita número… verifique na requisição se não tem algum parâmetro mandando valor inválido

anderson_lr

Estou dando um post via ajax com jquery. Também coloquei um breakpoint no meu controller pra verificar se a entidade está com os atributos setados corretamente e está tudo certo. Percebi um coisa interessante. Quando eu faço logout no sistema e logo novamente eu consigo cadastrar umas três vezes e o erro começa novamente. Aí eu logo denovo e volta… Quanto o usuário faz login eu adiciono ele uma uma variável de sessão:

@Component
@SessionScoped
public class EscopoDeSessao implements Serializable {

    private Usuario usuario;
    private HttpSession httpSession;
    private HttpServletRequest httpServletRequest;

    public EscopoDeSessao(HttpSession httpSession, HttpServletRequest httpServletRequest) {
        this.httpSession = httpSession;
        this.httpServletRequest = httpServletRequest;
    }

    public Usuario getUsuario() {
        return (Usuario) this.httpSession.getAttribute("usuario");
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
        this.httpSession.setAttribute("usuario", usuario);
    }

}

Aí então eu criei um interceptor pra verificar se o usuário está tem permissão pra cada lógica que ele executa:

@Component
@Intercepts
public class UsuarioInterceptor implements Interceptor {

    private DaoFactory daoFactory;
    private EscopoDeSessao escopoDeSessao;
    private Result result;

    public UsuarioInterceptor(DaoFactory daoFactory, EscopoDeSessao escopoDeSessao, Result result) {

        this.escopoDeSessao = escopoDeSessao;
        this.daoFactory = daoFactory;
        this.result = result;

    }
   
    public boolean accepts(ResourceMethod method) {

        String descricaoLogica = method.getMethod().getName();

        if (descricaoLogica.equals("login") || descricaoLogica.equals("logout") || descricaoLogica.equals("lerMensagem") ) {

            return false;

        } else {

            return true;

        }

    }

    public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException {

        String descricaoController = method.getResource().getType().getSimpleName();
        String descricaoLogica = method.getMethod().getName();

        /*
         * Se o usuario ainda nao esta logado, interrompe
         */
        if (escopoDeSessao.getUsuario() == null) {

            /*
             * Opa! Usuário não fez login ainda!
             */
            Exception erro = new Exception("Atenção! Você não pode disparar eventos no sistema sem estar autenticado.");

            result.include("erro", erro);
            result.forwardTo(UsuarioController.class).formularioLogin();

        }

        /*
         * Verifica a permissão do usuario para execução da logica
         */
        if (daoFactory.getLogicaDoUsuarioDao().logicaPermitida(descricaoController, descricaoLogica, escopoDeSessao.getUsuario())) {

            /*
             * Ultimo Controller e Lógica acessados pelo Usuário, para serem colocados no monitor de sessão.
             */
            escopoDeSessao.setUltimoControllerLogica(descricaoController+"."+descricaoLogica);

            stack.next(method, resourceInstance);

        } else {

            result.include("titulo", "Falta de Permissão.");
            result.include("mensagem", "Você não esta autorizado a executar esta ação: { Controller: [ "+descricaoController+" ] - Lógica: [ "+descricaoLogica+" ] }.");
            result.forwardTo("/mensagemGenerica.jsp");

        }

    }
    
}

Será que pode ser problema com validação de usuário?

Lucas_Cavalcanti

faz o seguinte, coloca no controller, na primeira linha da lógica com erro:

validator.onErrorUsePageOf(this).<páginaAnterior>();

e manda imprimir na jsp o ${errors}, pra ver qual foi o erro

anderson_lr

Mesmo fazendo o post via ajax com JQuery?

Lucas_Cavalcanti

se a resposta é json, vc pode usar o onErrorForwardTo. Mas sim, funciona mesmo com ajax

Criado 27 de setembro de 2011
Ultima resposta 28 de set. de 2011
Respostas 5
Participantes 2