如何避免触发第三方JS组件时AbstractDefaultAjaxBehavior的StalePageException
解决Wicket 6中AbstractDefaultAjaxBehavior触发的StalePageException问题
核心解决方案
在Wicket 6中,AbstractDefaultAjaxBehavior的getCallbackUrl()方法默认会携带当前页面的renderCount参数。当页面存在其他Ajax操作时,页面的renderCount会递增,之前预先生成的URL里的旧renderCount就会触发Wicket抛出StalePageException。
解决的关键是生成**不带renderCount**的回调URL,具体做法是调用getCallbackUrl(false)(该重载方法的参数用于控制是否包含renderCount)。
修改后的Java代码
将原生成回调URL的逻辑替换为如下代码:
behaviorDisable = new AbstractDefaultAjaxBehavior() { protected void respond(final AjaxRequestTarget target) { // 业务逻辑代码 } }; add(behaviorDisable); // 使用getCallbackUrl(false)生成不带renderCount的URL String callback = String.valueOf(behaviorDisable.getCallbackUrl(false)); hiddenfield = new HiddenField("callBackUrl", new Model(callback)); add(hiddenfield);
原理说明
Wicket 6允许通过getCallbackUrl(boolean includeRenderCount)控制URL是否携带renderCount。当传入false时,生成的URL不会包含该参数,Wicket处理请求时会自动匹配页面的最新状态,不会因为旧的renderCount拒绝请求,也就避免了页面重定向和用户选择状态丢失的问题。
这种方式完全适配你的场景:不需要在每次Ajax请求前重新获取URL,预先生成的URL可以持续使用,不受其他Ajax操作导致的renderCount变化影响。
JavaScript代码无需修改
你现有的JavaScript代码可以保持不变,因为隐藏域中存储的已经是不带renderCount的合法URL:
Wicket.Ajax.get({ "u" : document.getElementById('callBackUrl').value });
内容的提问来源于stack exchange,提问作者Entropy
相关产品推荐
相关产品推荐

