Jsf 2 在PhaseListener中记录调用的托管bean actionListener

Jsf 2 在PhaseListener中记录调用的托管bean actionListener,jsf-2,phaselistener,Jsf 2,Phaselistener,我需要记录从托管Bean触发的操作。此链接帮助我解决与操作相关的问题。但是,当我使用actionListener时,我有一个NullPointerException @Override public void beforePhase(PhaseEvent event) { FacesContext context = event.getFacesContext(); if (context.isPostback()) { UICommand component

我需要记录从托管Bean触发的操作。此链接帮助我解决与操作相关的问题。但是,当我使用
actionListener
时,我有一个
NullPointerException

@Override
public void beforePhase(PhaseEvent event) {
    FacesContext context = event.getFacesContext();

    if (context.isPostback()) {
        UICommand component = findInvokedCommandComponent(context);

        if (component != null) {
            String methodExpression = component.getActionExpression().getExpressionString(); 
            // It'll contain #{bean.action}.
        }
    }
}

private UICommand findInvokedCommandComponent(FacesContext context) {
    UIViewRoot view = context.getViewRoot();
    Map<String, String> params = context.getExternalContext().getRequestParameterMap();

    if (context.getPartialViewContext().isAjaxRequest()) {
        return (UICommand) view.findComponent(params.get("javax.faces.source"));
    } else {
        for (String clientId : params.keySet()) {
            UIComponent component = view.findComponent(clientId);

            if (component instanceof UICommand) {
                return (UICommand) component;
            }
        }
    }

    return null;
}
如何获取
actionListener
方法的名称? 我试过了

private UICommand findinVokedCommand组件(FacesContext上下文){
UIViewRoot视图=context.getViewRoot();
Map params=context.getExternalContext().getRequestParameterMap();
if(context.getPartialViewContext().isAjaxRequest()){
UIComponent=view.findComponent(params.get(“javax.faces.source”);
if(UICommand的组件实例){
//组件。获取
UICommand comp=(UICommand)组件;
ActionListener[]actionListeners=comp.getActionListeners();
System.out.println(“Taille des Listeners:+actionListeners.length”);
ActionListener方法;
方法=actionListeners[0];
String-toString=method.toString();
System.out.println(“ActionListener:+toString”);
返回(UICommand)组件;
}
}否则{
for(字符串clientId:params.keySet()){
UIComponent=view.findComponent(clientId);
if(UICommand的组件实例){
返回(UICommand)组件;
}
}
}
返回null;
}
System.out.println(“ActionListener:+toString”);返回ActionListener:`javax.faces.event。MethodExpressionActionListener@16a779b` . 我想要的是`{bean.action}`。也许我做得不对

您走的很好,但是您需要获得实现
ActionListener
方法ExpressionActionListener
。使用它,您仍然无法获得现成的
MethodExpression
,可能唯一的方法是通过反射获得它(不是最好的方法…)

也就是说,您可以这样修改代码:

if (component != null) {
    String methodExpression = "";

    if(component.getActionExpression() != null)
    {
        methodExpression = component.getActionExpression().getExpressionString(); 
    }
    else if(component.getActionListeners().length > 0)
    {
        methodExpression = getActionListener((MethodExpressionActionListener)component.getActionListeners()[0]).getExpressionString();
    }

    System.out.println("Method Expression : " + methodExpression);
}
您需要使用此方法从
方法ExpressionActionListener
中实际获取所需信息:

private MethodExpression getActionListener(MethodExpressionActionListener listener)
{
    MethodExpression expression = null;
    Field field;

    try
    {
        field = listener.getClass().getDeclaredField("methodExpressionZeroArg");
        field.setAccessible(true);
        expression = (MethodExpression)field.get(listener);

        if(expression == null)
        {
            field = listener.getClass().getDeclaredField("methodExpressionOneArg");
            field.setAccessible(true);
            expression = (MethodExpression)field.get(listener);
        }
    }
    catch(Exception e)
    {

    }

    return expression;
}

谢谢你的帮助和耐心:)用你的help@bouikstefan不客气,如果它正确回答了您的问题,您应该接受它!
if (component != null) {
    String methodExpression = "";

    if(component.getActionExpression() != null)
    {
        methodExpression = component.getActionExpression().getExpressionString(); 
    }
    else if(component.getActionListeners().length > 0)
    {
        methodExpression = getActionListener((MethodExpressionActionListener)component.getActionListeners()[0]).getExpressionString();
    }

    System.out.println("Method Expression : " + methodExpression);
}
private MethodExpression getActionListener(MethodExpressionActionListener listener)
{
    MethodExpression expression = null;
    Field field;

    try
    {
        field = listener.getClass().getDeclaredField("methodExpressionZeroArg");
        field.setAccessible(true);
        expression = (MethodExpression)field.get(listener);

        if(expression == null)
        {
            field = listener.getClass().getDeclaredField("methodExpressionOneArg");
            field.setAccessible(true);
            expression = (MethodExpression)field.get(listener);
        }
    }
    catch(Exception e)
    {

    }

    return expression;
}