Jsf 2 在PhaseListener中记录调用的托管bean actionListener
我需要记录从托管Bean触发的操作。此链接帮助我解决与操作相关的问题。但是,当我使用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
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;
}