StaleLinkException 해결, StaleSessionException 문제 사용자 정의 오류 페이지로 이동

8252 단어 .netRESTtapestry
오늘 시간을 내서 T4의 원본 코드를 살펴보았는데 StaleLink Exception Stale Session Exception 문제를 해결하기 위해서 이 문제는 T4회에서 영어로 된 힌트 정보를 되돌려주는 것이 시스템을 사용하는 사람들에게 매우 불친절한 힌트입니다.
T4의 소스 코드를 보면 이 exception을 처리하는 코드가AbstractEngine 클래스에서 다음과 같은 코드를 발견할 수 있습니다

 public void service(WebRequest request, WebResponse response) throws IOException
    {
        IRequestCycle cycle = null;
        IMonitor monitor = null;
        IEngineService service = null;

        if (_infrastructure == null){
            _infrastructure = (Infrastructure) request.getAttribute(Constants.INFRASTRUCTURE_KEY);
        }

        // Create the request cycle; if this fails, there's not much that can be done ... everything
        // else in Tapestry relies on the RequestCycle.

        try
        {
            cycle = _infrastructure.getRequestCycleFactory().newRequestCycle(this);
    
        }
        catch (RuntimeException ex)
        {
            throw ex;
        }
        catch (Exception ex)
        {
            throw new IOException(ex.getMessage());
        }

        try
        {
            try
            {
                monitor = cycle.getMonitor();               
                service = cycle.getService();              
                monitor.serviceBegin(service.getName(), _infrastructure.getRequest()
                        .getRequestURI());
              
                // Let the service handle the rest of the request.

                service.service(cycle);
               
                return;
            }
            catch (PageRedirectException ex)
            {
                handlePageRedirectException(cycle, ex);
            }
            catch (RedirectException ex)
            {
                handleRedirectException(cycle, ex);
            }
            catch (StaleLinkException ex)
            {
                handleStaleLinkException(cycle, ex);
            }
            catch (StaleSessionException ex)
            {
                handleStaleSessionException(cycle, ex);
            }
        }
        catch (Exception ex)
        {
            monitor.serviceException(ex);

            // Attempt to switch to the exception page. However, this may itself
            // fail for a number of reasons, in which case an ApplicationRuntimeException is
            // thrown.

            if (LOG.isDebugEnabled())
                LOG.debug("Uncaught exception", ex); 
            activateExceptionPage(cycle, ex);
        }
        finally
        {
            if (service != null){            	
                monitor.serviceEnd(service.getName());
            }

            try
            {
                cycle.cleanup();              
                _infrastructure.getApplicationStateManager().flush();
            }
            catch (Exception ex)
            {System.out.println("%%%-"+"AbstractEngine"+"_20");
                reportException(EngineMessages.exceptionDuringCleanup(ex), ex);
            }
        }
    }


보시다시피 처리 exception은 바로...
   handleRedirectException(cycle, ex),                handleStaleLinkException(cycle, ex);
이 두 가지 방법
이 두 가지 방법은 다음과 같습니다.

 protected void handleStaleLinkException(IRequestCycle cycle, StaleLinkException exception)
            throws IOException
    {
        _infrastructure.getStaleLinkExceptionPresenter()
                .presentStaleLinkException(cycle, exception);
    }


 protected void handleStaleSessionException(IRequestCycle cycle, StaleSessionException exception)
            throws IOException
    {
        _infrastructure.getStaleSessionExceptionPresenter().presentStaleSessionException(
                cycle,
                exception);
    }

추적 방법의 실행을 계속하려면 다음과 같이 하십시오.


public StaleSessionExceptionPresenter getStaleSessionExceptionPresenter()
    {
        return (StaleSessionExceptionPresenter) getProperty("staleSessionExceptionPresenter");
    }

 public StaleLinkExceptionPresenter getStaleLinkExceptionPresenter()
    {
        return (StaleLinkExceptionPresenter) getProperty("staleLinkExceptionPresenter");
    }


public class StaleSessionExceptionPresenterImpl implements StaleSessionExceptionPresenter
{
    private ResponseRenderer _responseRenderer;

    private String _pageName;

    public void presentStaleSessionException(IRequestCycle cycle, StaleSessionException cause)
            throws IOException
    {
        IPage exceptionPage = cycle.getPage(_pageName);

        cycle.activate(exceptionPage);

        _responseRenderer.renderResponse(cycle);
    }

    public void setPageName(String pageName)
    {
        _pageName = pageName;
    }

    public void setResponseRenderer(ResponseRenderer responseRenderer)
    {
        _responseRenderer = responseRenderer;
    }

}




public class StaleLinkExceptionPresenterImpl implements StaleLinkExceptionPresenter
{
    private ResponseRenderer _responseRenderer;

    private String _pageName;

    public void presentStaleLinkException(IRequestCycle cycle, StaleLinkException cause)
            throws IOException
    {
        IPage exceptionPage = cycle.getPage(_pageName);

        PropertyUtils.write(exceptionPage, "message", cause.getMessage());

        cycle.activate(exceptionPage);

        _responseRenderer.renderResponse(cycle);
    }

    public void setPageName(String pageName)
    {
        _pageName = pageName;
    }

    public void setResponseRenderer(ResponseRenderer responseRenderer)
    {
        _responseRenderer = responseRenderer;
    }

}


위의 방법을 계속 추적하면 발견할 수 있습니다페이지Name의 이름: StaleLink, StaleSession
이 이름이 Framework에서 온 걸로 알고 있습니다.library 파일에서 추출한 것입니다. 이 파일을 열면 찾을 수 있습니다
다음 세 마디

    <page name="StaleLink" specification-path="pages/StaleLink.page"/>
    <page name="StaleSession" specification-path="pages/StaleSession.page"/>
    <page name="Exception" specification-path="pages/Exception.page"/>
   

위의 코드를 (으)로 수정

    <page name="StaleLink" specification-path="pub/ErrorPage"/>
    <page name="StaleSession" specification-path="pub/ErrorPage"/>
    <page name="Exception" specification-path="pages/Exception.page"/>
   

자, 여기 설명 exception 은 아래 코드 를 통해 설정할 수 있지만, 같은 설정 사상 으로 다른 것 을 설정할 수 있다
두 개의 exception이 안 되니, 어쩔 수 없이 그의 원본 파일을 수정할 수밖에 없다

<contribution configuration-id="tapestry.InfrastructureOverrides">
        <property name="exceptionPageName" value="pub/ErrorPage"/>
    </contribution>


인터넷에 검색해 보세요 - 이 문제를 처리하는 더 간편한 방법이 생겼습니다 - -
응용 프로그램 프로필에 아래 코드를 추가하면 T4가 자동으로 기본 구성을 바꿉니다
timeout의 클래스는 StaleLink 클래스를 상속해야 합니다.

 <page name="StaleLink" specification-path="/pub/TimeOut.page"/>

  <page name="StaleSession" specification-path="/pub/TimeOut.page"/>

참조 문서:
http://www.blogjava.net/tapestry/archive/2007/01/29/96568.aspx

좋은 웹페이지 즐겨찾기