2017-03-12 4 views
0

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. 사용자는 페이지를 (이 상태입니다) 열고 브라우저 탭에서 열어 둡니다.
  2. 사용자가 다른 페이지를 엽니 다.
  3. 세션이 아직 작동 중이지만 1 단계의 원본 페이지가 페이지 저장에서 제외됩니다. 즉, 만료됩니다.
  4. 사용자가 초기 브라우저 탭으로 돌아가서 링크를 클릭합니다. 여기에 링크의 코드입니다 :

    AjaxLink<Void> link = new AjaxLink<Void>("link") { 
        @Override 
        public void onClick(AjaxRequestTarget target) { 
         showWindow(dataModel, window, target); 
        } 
    }; 
    add(link); 
    
  5. 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 요청시 nullPageParameters입니다.

  6. 개찰구가 개찰을 시작합니다. 페이지가 페이지 저장소에서 제거됩니다

    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); 
    

    그러나 pageParametersnull 그녀입니다 :

    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() 메소드), 적어도 페이지가 폭발하지 않고 자체적으로 새로 고침됩니다.

질문은 있습니다

  1. 우리가 뭘 잘못하거나 개찰구의 버그 때문에 이런 일이 있습니까?
  2. 적용한 수정 프로그램이 적용됩니까? https://issues.apache.org/jira/browse/WICKET-4594에 의해 도입 된 변경 사항이 단지 재미로 만들어진 것이 아님을 알려드립니다.
  3. Google의 수정으로 인해 상태 보존 페이지 만 있다는 사실을 알 수 있습니까?

답변

2

이것은 7.x에서 구현 된 Wicket 6.x의 제한 사항입니다. 6.x는 누군가의 응용 프로그램을 자동으로 중단시키지 않을지 확신하지 못했기 때문에이 변경 사항을 적용하지 않았습니다. IIRC 업그레이드 중에 필요할 경우 이전 동작으로 되돌리려면 7.x의 메서드를 재정의 할 수 있습니다. AFAIK 아무도이 7.x에서이 변경 사항에 대해 불만을 제기 했으므로 6.x (6.27.0)로 백 포트하는 것이 좋습니다. 그러나 Wicket의 활성 개발자 중 누구도 더 이상 6.x를 사용하지 않으며 누군가 그것을 수행 할 기회가 없습니다 다소 낮습니다. 7.x로 업그레이드하는 것이 좋습니다. 안정적이며 많은 새로운 기능과 버그 수정이 있습니다. 그때까지는이 요청 매퍼의 사용자 지정 버전을 사용하는 것이 좋습니다.