Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Recuperar Objeto do método Interceptado

No sistema que estou desenvolvendo eu tenho uma regra de negócio que é a seguinte: apenas administradores ou o próprio usuário que incluiu a publicação pode alterar ou excluir a publicação. Tenho códigos repetidos em várias partes no meu controller e então achei que um bom lugar para ele seria um interceptor. Então eu criaria uma anotação qualquer @Checa e em todos os métodos anotados eu interceptaria e faria esta checagem, mas como eu pego por exemplo a matéria que vem no método interceptado? dá realmente pra fazer isso que estou querendo?

@Post("/materias/salvar")
    public void salvar(@Valid Materia materia){
//faz um monte de coisas e salva
}
@Intercepts
@RequestScoped
public class ChecadorPermissaoInterceptor {

    @Inject
    private UsuarioLogado usuarioLogado;

    @Inject
    private Result result;

    @Inject
    private ControllerMethod controllerMethod; 


    @Accepts
    public boolean accepts(){
    return !controllerMethod.containsAnnotation(Checa.class);
    }

        @AroundCall
        public void intercept(SimpleInterceptorStack stack){
            //aqui o problema!!!
             //como pego a materia que vem por parâmetro no método interceptado? 
            if(materia.permiteEdicao(usuarioLogado)){
               stack.next();
            }else{
               result.redirectTo(MateriaController.class).form();
            }

        }
}
2 respostas
solução!

Opa, vc pode dar uma olhada aqui na documentação=> http://www.vraptor.org/en/docs/interceptors/

Você pode criar um método, anotar com @Accepts, receber um ControllerMethod como argumento e pegar o parametro do método do controller.

Olá Alberto, obrigado por responder. Então, até consegui recuperar o objeto matéria que vai no método interceptado,a solução funcionou, mas não é bem o resultado que eu queria pois o tratamento ficou bem genérico, no caso da minha implementação o máximo que eu vou conseguir é mandar para uma página de acesso negado, eu gostaria que a aplicação fizesse um foward para a mesma página com a mensagem que o usuário não tem permissão. Implementei da seguinte forma:

@Intercepts
@RequestScoped
public class PermissaoInterceptor {


    @Inject
    private UsuarioLogado usuarioLogado;

    @Inject
    private Result result;

    @Inject
    private MethodInfo methodInfo;

    @Inject
    private ControllerMethod controllerMethod; 

    @Accepts
    public boolean accepts(){

    return controllerMethod.containsAnnotation(ChecaPermissao.class);
    }

     @AroundCall
        public void intercept(SimpleInterceptorStack stack){


        Object[] objects =  methodInfo.getParametersValues();
        Materia materia = (Materia) objects[0];
        if(materia != null && materia.getMateriaId()!= null
                && materia.permiteModificacao(usuarioLogado.getUsuario())){
               stack.next();
        }else{
//como é apenas um teste redirecionei para o login
               result.redirectTo(LoginController.class).form();

        }

     }


}