Проблема здесь:
$.ajax({
url: window.location.href,
...});
StalePageException
выбрасывается Wicket, когда пользователь пытается использовать страницу экземпляр , которая была обработана как минимум еще один раз с момента визуализации текущей страницы.
URL, созданные Wicket, выглядят так: some/path?11-22.path~to~component.33
.
Здесь 11
- идентификатор страницы. Это уникальный идентификатор экземпляра страницы для текущего сеанса http.
22
- количество отображаемых страниц. Он показывает, сколько раз этот конкретный экземпляр страницы отображался.
33
- индекс поведения компонента. Это не интересно для этой проблемы.
Итак, 22
является причиной проблемы. Когда страница отображается с помощью Wicket, значение renderCount равно X
. Затем при вызове Ajax по URL-адресу текущего экземпляра страницы Wicket увеличит значение renderCount на стороне сервера до X+1
. Позже, когда вы нажмете на любую ссылку / кнопку на странице, Wicket отправит запрос с X
и провалит сравнение на стороне сервера с X+1
, и Wicket сгенерирует PageStaleException.
У вас есть несколько вариантов, чтобы избежать этого:
- монтирование ресурса (см. Application.mountResourceReference). Это похоже на простой сервлет. Преимущества состоят в том, что ресурсы / сервлеты не сохраняют состояния и не будет никакой конструкции ответа. Все, что вам нужно, это отправить простой запрос GET (даже HEAD в порядке), чтобы обновить сеанс http
- сделать запрос к
/some/page
(без строки запроса, ?11
). Это создаст новый экземпляр этой страницы и, следовательно, не повлияет на текущий экземпляр. Но он выполнит всю работу, необходимую для визуализации этой страницы, например попадание в базу данных и т. Д.