StaleLinkException 해결, StaleSessionException 문제 사용자 정의 오류 페이지로 이동
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AS를 통한 Module 개발1. ModuleLoader 사용 2. IModuleInfo 사용 ASModuleOne 모듈...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.