Deprecated richfaces javax.faces.el.MethodBinding replacement use

混江龙づ霸主 提交于 2019-11-29 10:51:13

The javadocs state it clearly:

Application.createMethodBinding

Deprecated. This has been replaced by calling getExpressionFactory() then ExpressionFactory.createMethodExpression(javax.el.ELContext, java.lang.String, java.lang.Class, java.lang.Class[]).

Here's how to use it:

MethodExpression methodExpression = 
    application.getExpressionFactory().createMethodExpression(
         FacesContext.getCurrentInstance().getELContext(), 
         "#{PrismBacking.onItemClick}", 
         null, 
         new Class[] { ActionEvent.class });
menuItem.setActionExpression(methodExpression);

As usual, all the deprecation is indeed just described in the API docs, including details about the replacement.

To have a clear overview, here are both the pre-JSF 1.2 and post-JSF 1.2 ways to create an Action and ActionListener dynamically:

Create Action binding in JSF 1.0/1.1:

MethodBinding action = FacesContext.getCurrentInstance().getApplication()
    .createMethodBinding("#{bean.action}", new Class[0]);
uiCommandComponent.setAction(action);

Create ActionListener binding in JSF 1.0/1.1:

MethodBinding actionListener =  FacesContext.getCurrentInstance().getApplication()
    .createMethodBinding("#{bean.actionListener}", new Class[] {ActionEvent.class});
uiCommandComponent.setActionListener(actionListener);

Create Action expression in JSF 1.2 or newer:

FacesContext context = FacesContext.getCurrentInstance();
MethodExpression action = context.getApplication().getExpressionFactory()
    .createMethodExpression(context.getELContext(), "#{bean.action}", String.class, new Class[0]);
uiCommandComponent.setActionExpression(action);

Create ActionListener expression in JSF 1.2 or newer:

FacesContext context = FacesContext.getCurrentInstance();
MethodExpression actionListener = context.getApplication().getExpressionFactory()
    .createMethodExpression(context.getELContext(), "#{bean.actionListener}", null, new Class[] {ActionEvent.class});
uiCommandComponent.addActionListener(new MethodExpressionActionListener(actionListener));

To avoid lot of boilerplate code, you can just wrap it nicely in helper methods (if necessary in an helper/utility class), e.g.:

public static MethodExpression createAction(String actionExpression, Class<?> returnType) {
    FacesContext context = FacesContext.getCurrentInstance();
    return context.getApplication().getExpressionFactory()
        .createMethodExpression(context.getELContext(), actionExpression, returnType, new Class[0]);
}

public static MethodExpressionActionListener createActionListener(String actionListenerExpression) {
    FacesContext context = FacesContext.getCurrentInstance();
    return new MethodExpressionActionListener(context.getApplication().getExpressionFactory()
        .createMethodExpression(context.getELContext(), actionListenerExpression, null, new Class[] {ActionEvent.class}));
}

so that you can just use it as follows:

uiCommandComponent.setActionExpression(createAction("#{bean.action}", String.class);
uiCommandComponent.addActionListener(createActionListener("#{bean.actionListener}");

The replacement mechanisms are detailed in the JEE5 API (of which JSF is part):

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!