【问题标题】:a4j jsFunction not triggering server side methoda4j jsFunction不触发服务器端方法
【发布时间】:2014-01-28 17:19:43
【问题描述】:

我这样调用客户端函数:invalidateUserSession()。我知道客户端功能已被触发,因为我在 oncomplete 事件中放置了一个警报。出于某种原因,服务器端的方法永远不会被调用。

客户端代码:

<a4j:jsFunction 
    name="invalidateUserSession"
    action="#{billingController.invalidateSession}"
    immediate="true"
    oncomplete="alert('invalidate');"
/>

服务器端代码:

public void invalidateSession(){
     log.info("Invalidation session...");
     FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
}

【问题讨论】:

  • 您在这里使用immediate 有什么原因吗?你试过没有它吗?还要检查指定完整的action="#{billingController.invalidateSession()} 是否会有所不同。只是检查一下显而易见的,您已经在其中放置了一个断点并观察到它从未被命中,因此您可以断言“从未被调用”?
  • @mabi remove immediate="true" 做到了。发表您的评论作为答案,以便我接受。

标签: javascript jsf richfaces ajax4jsf


【解决方案1】:

根据 cmets,只需从标签中删除 immediate=true

必填链接:Debugging JSF lifecycle

还要注意you are still displaying the user's data,并且可能希望在会话失效后重定向/重新获取页面。

【讨论】:

    【解决方案2】:

    您的操作应返回 Object,例如 String。请参阅VDL documentation 中的action 属性说明:

    MethodExpression 表示当此组件被调用时要调用的应用程序操作 由用户激活。表达式必须计算为一个不接受的公共方法 参数,并返回一个对象(调用其 toString() 以导出逻辑 结果),它被传递给此应用程序的 NavigationHandler。

    在方法签名中简单地将 void 更改为 String。

    【讨论】:

    • 尽管 VDL 这么说,但它不是 actually true。 “返回”void 与此处的null 相同。
    • 谢谢@mabi,我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 2011-07-20
    • 2020-01-09
    相关资源
    最近更新 更多