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();
}
}
}