Wicket 6 (버전 6.22.0)에 문제가 발생했습니다. 페이지가 만료 된 후 Wicket은 페이지 클래스 및 PageParameters
을 인수로 사용하여 생성자를 호출하여이를 재구성하려고 시도하지만 일부 매개 변수 (예 : PageParameters
)가 공백으로 요청과 함께 보냈습니다.Wicket 6 : 만료 후 페이지를 다시 만들 때 빈 PageParameters
After Wicket session timeout - pageParameters are null 같은 문제가있는 것으로 보입니다.
WICKET-5068에는 Wicket 7에 대한 해결책이 있지만 우리는 Wicket 6을 가지고 있으며 수정해야합니다.
다음은 우리의 발견과 몇 가지 질문에 대한 오랜 설명입니다. 여기
이 일어나는 것이다 :
- 사용자는 페이지를 (이 상태입니다) 열고 브라우저 탭에서 열어 둡니다.
- 사용자가 다른 페이지를 엽니 다.
- 세션이 아직 작동 중이지만 1 단계의 원본 페이지가 페이지 저장에서 제외됩니다. 즉, 만료됩니다.
사용자가 초기 브라우저 탭으로 돌아가서 링크를 클릭합니다. 여기에 링크의 코드입니다 :
AjaxLink<Void> link = new AjaxLink<Void>("link") { @Override public void onClick(AjaxRequestTarget target) { showWindow(dataModel, window, target); } }; add(link);
BookmarkableMapper
하는 동안 다음과 같은 메서드를 호출 요청에서IRequestHandler
을 빌드는 (AbstractBookmarkableMapper : 294)으로부터 내장되어protected PageParameters getPageParametersForListener(PageInfo pageInfo, PageParameters pageParameters) { if (pageInfo.getPageId() != null) { // WICKET-4594 - ignore the parsed parameters for stateful pages return null; } return pageParameters; }
그래서
ListenerInterfaceRequestHandler
요청시null
은PageParameters
입니다.개찰구가 개찰을 시작합니다. 페이지가 페이지 저장소에서 제거됩니다
private void resolvePageInstance(Integer pageId, Class<? extends IRequestablePage> pageClass, PageParameters pageParameters, Integer renderCount) { IRequestablePage page = null; boolean freshCreated = false; if (pageId != null) { page = getStoredPage(pageId); } if (page == null) { if (pageClass != null) { page = getPageSource().newPageInstance(pageClass, pageParameters); freshCreated = true; } } if (page != null && !freshCreated) { if (renderCount != null && page.getRenderCount() != renderCount) { throw new StalePageException(page); } } pageInstanceIsFresh = freshCreated; pageInstance = page; }
, 다음과 같은 문장의 조건은 보유 : 그것은 (라인 252에서 시작 PageProvider) 클릭 한 링크가 속한, 이것은 다음과 같은 방법으로 이루어집니다 페이지를 복원하려고 :
page = getPageSource().newPageInstance(pageClass, pageParameters);
그러나
pageParameters
가null
그녀입니다 :if (page == null)
는 그래서 클래스와 페이지 매개 변수에서 페이지 인스턴스를 만들려고 e (항목 5의
getPageParametersForListener()
때문에). 따라서 페이지 생성자는 빈PageParameters
이되고 일부 ID가 예상대로 실패합니다.여기
는 (나머지는 관련이 없다로만 가기 선과) 생성 된 예외 : 여기pageParameters.get("id").toLong()
PageParameters
로부터 ID를 추출하는 코드 :
org.apache.wicket.util.string.StringValueConversionException: Unable to convert 'null' to a long value
at org.apache.wicket.util.string.StringValue.toLong(StringValue.java:664)
그래서 우리의 경우
getPageParametersForListener()
방법은 만료 된 페이지의 처리를 복원 할 수있는 가능성을 나누기. 이 문제를 해결하려고 노력하는
, 우리는 우리의 사용자 정의 구현과 BookmarkableMapper
를 교체했습니다 : 우리가 WebApplication#init()
방식에 마운트
public class BookmarkableMapperThatSavesPageParametersForListener extends BookmarkableMapper {
@Override
protected PageParameters getPageParametersForListener(PageInfo pageInfo, PageParameters pageParameters) {
return pageParameters;
}
}
:
우리가 직면했던 문제를 해결하기 위해 보인다mount(new BookmarkableMapperThatSavesPageParametersForListener());
with : 링크 클릭으로 핸들러가 실행되지 않지만 (onClick()
메소드), 적어도 페이지가 폭발하지 않고 자체적으로 새로 고침됩니다.
질문은 있습니다
- 우리가 뭘 잘못하거나 개찰구의 버그 때문에 이런 일이 있습니까?
- 적용한 수정 프로그램이 적용됩니까? https://issues.apache.org/jira/browse/WICKET-4594에 의해 도입 된 변경 사항이 단지 재미로 만들어진 것이 아님을 알려드립니다.
- Google의 수정으로 인해 상태 보존 페이지 만 있다는 사실을 알 수 있습니까?