JSF - interceptar chamada de método

9 respostas
andrepestana

Pessoal,

No JSF como consigo obter o nome do método que será chamado num ManagedBean para decidir se ele pode ou não ser executado?
Eu estava pensando em fazer isso com um PhaseListener mas não achei nenhum método que me dá a chamada para o método.

Alguém pode dar um exemplo?

[]'s

Pestana

9 Respostas

F

Estou fazendo isso para implementar um sistema de segurança. Estou usando JBoss AOP. Você pode usar tb AspectJ.

Flw

andrepestana

Por favor,

alguém poderia me dar uma luz para obter o nome do método que será chamado ou a expression language que foi executada?

Eu não “posso” usar AOP. Preciso fazer no phaselistener.

Procurei muito sobre o assunto e não achei nada.

André

F

As EL são invocadas pelos toda vez que você invocar o método do componente

public Object getValue() {

	if (this.value != null) {
	    return (this.value);
	}
	ValueExpression ve = getValueExpression("value");
	if (ve != null) {
	    try {
		return (ve.getValue(getFacesContext().getELContext()));
	    }
	    catch (ELException e) {
		throw new FacesException(e);
	    }
	} else {
	    return (null);
	}

    }

Toda x que você chamar o método getValue ele vai executar a EL isso pode ser executado por exemplo nas fases PROCESS_VALIDATIONS, INVOKE_APPLICATION e RENDER_RESPONSE.

keller

Ola,

Que tal um filter?
( http://java.sun.com/products/servlet/Filters.html )

Nao faz isso nao, se com filter nao funcionar utilize um Proxy.
Boa sorte! :thumbup:

andrepestana

Fre_d,

Estou usando myfaces 1.1.4 e o FacesContext não tem esse método getELContext().

Tb não entendí o que vc quis dizer:

Keller,
Não quero filtro. Gostaria de saber se há um jeito de implementar um PhaseListener que me dá a chamada para o método ou a EL chamada.

Valeu,

F

O código que postei é da versão 1.2

Abaixo versão 1.1 UIInput método getValue

public Object getValue() {

	if (this.value != null) {
	    return (this.value);
	}
	ValueBinding vb = getValueBinding("value");
	if (vb != null) {
	    return (vb.getValue(getFacesContext()));
	} else {
	    return (null);
	}

    }

O que quis dizer é o seguinte. Toda vez que você chama o método UIInput.getValue() ele invoca a EL. Então essa EL pode ser invocada em qualquer fase como por exemplo PROCESS_VALIDATIONS, INVOKE_APPLICATION e RENDER_RESPONSE

Exemplos:

PROCESS_VALIDATIONS
validação: UIInput.getValue() == null -> enviar erro para tela

INVOKE_APPLICATION
Bean: buscaUsuario(UIInput.getValue());

RENDER_RESPONSE
InputRenderer: UIInput.getValue() -> exibir o valor para o usuário

Em todas essas fases a EL foi invocada.

O JBoss Seam utiliza AOP para fazer as interceptações, acho muito dificil você conseguir fazer de outra forma

Flw

andrepestana

fre_d,

obrigado pela força, cara, mas o que eu preciso é obter a EL no PhaseListener e os métodos do phaselistener só recebem um PhaseEvent. Ex.:

public void beforePhase(PhaseEvent e) {
        
                //Perciso pegar a EL chamada ou o nome do método do bean aqui!         

        }

Como dentro de um métdo do PhaseListener eu consigo obter a EL chamada ou o nome do método do bean?

Eu quero receber todas as EL’s chamadas, não uma específica ou de um componente específico como UIInput.

valeu,

F

Da uma olhada nos fontes e veja quando um PhaseListener é acionado. É sempre antes e depois das fases. Os EL são executados dentro das fases.

andrepestana

desculpe, fre_d, mas não respondeu a minha pergunta.

Eu preciso de um exemplo que mostre como obter a EL num phaseListener. Eu já procurei bastante antes de perguntar aqui neste forum.

Alguém sabe como fazer isso?

grato,

Criado 27 de junho de 2007
Ultima resposta 5 de jul. de 2007
Respostas 9
Participantes 3