Tapestry4自定义异常页面时候出错

jirabotuo 2008-12-16
在T4上自定义异常页面时候,出现以下错误:

引用

Unable to present exception page: Class $MyException_15 does not contain a property named 'exception'.


      Session id    : D00A92DCA3980860EA5B34235921C591

Exceptions:

org.apache.hivemind.ApplicationRuntimeException: Class $MyException_15 does not contain a property named 'exception'.
   component: $MyException_15@3c1[MyException]
   location: context:/MyException.page, line 6, column 21
org.apache.hivemind.util.ClassAdaptor.getPropertyAdaptor(ClassAdaptor.java:136)
org.apache.hivemind.util.ClassAdaptor.write(ClassAdaptor.java:60)
org.apache.hivemind.util.PropertyUtils.write(PropertyUtils.java:54)
org.apache.tapestry.error.ExceptionPresenterImpl.presentException(ExceptionPresenterImpl.java:44)
$ExceptionPresenter_11e3f0f3807.presentException($ExceptionPresenter_11e3f0f3807.java)
$ExceptionPresenter_11e3f0f3806.presentException($ExceptionPresenter_11e3f0f3806.java)
org.apache.tapestry.engine.AbstractEngine.activateExceptionPage(AbstractEngine.java:117)
org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:269)
org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:54)
$WebRequestServicer_11e3f0f3860.service($WebRequestServicer_11e3f0f3860.java)
$WebRequestServicer_11e3f0f385c.service($WebRequestServicer_11e3f0f385c.java)
org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:61)
$ServletRequestServicer_11e3f0f3842.service($ServletRequestServicer_11e3f0f3842.java)
org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
$ServletRequestServicerFilter_11e3f0f383e.service($ServletRequestServicerFilter_11e3f0f383e.java)
$ServletRequestServicer_11e3f0f3844.service($ServletRequestServicer_11e3f0f3844.java)
org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
$ServletRequestServicerFilter_11e3f0f383c.service($ServletRequestServicerFilter_11e3f0f383c.java)
$ServletRequestServicer_11e3f0f3844.service($ServletRequestServicer_11e3f0f3844.java)
org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
$ServletRequestServicerFilter_11e3f0f3840.service($ServletRequestServicerFilter_11e3f0f3840.java)
$ServletRequestServicer_11e3f0f3844.service($ServletRequestServicer_11e3f0f3844.java)
$ServletRequestServicer_11e3f0f3836.service($ServletRequestServicer_11e3f0f3836.java)
org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:126)
org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:103)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
java.lang.Thread.run(Unknown Source)


谢谢帮忙看下。主要不知道这个异常什么原因造成的。难道是说我的MyException类没有“exception”这个属性。怎么理解呢?


自定义异常页面时,总共建立了
MyException.java,MyException.html,MyException.page三个文件。
hivemodule.xml配置文件添加了一段:

引用

<!-- 自定义异常页面 -->
    <contribution configuration-id="tapestry.InfrastructureOverrides">
    <property name="exceptionPageName" value="MyException" />   
    </contribution>


MyException.java代码:
import org.apache.log4j.Logger;
import org.apache.tapestry.PageNotFoundException;
import org.apache.tapestry.annotations.InitialValue;
import org.apache.tapestry.html.BasePage;

public abstract class MyException extends BasePage {
	private static Logger logger = Logger.getLogger(PageNotFoundException.class);
	
	@InitialValue("false")
	public abstract boolean isPageNotFound();	
	public abstract void setPageNotFound(boolean pageNotFound);
	
	public void setExcepiton(Throwable t){
		logger.error("an exception occured",t);
		if(t instanceof PageNotFoundException || t.getCause() instanceof PageNotFoundException){
			this.setPageNotFound(true);
		}
	}

}


MyException.html代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>错误信息页面</title>
<link href="css/index_x.css" rel="stylesheet" type="text/css" />
</head>

<body>
<br />
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  
  <tr>
    <td>&nbsp;</td>
    <td><table border="0" cellspacing="0" cellpadding="0">
      
      <tr>
        <td height="5" bgcolor="#35A425"></td>
      </tr>
      <tr>
        <td height="3" bgcolor="#54874F"></td>
        </tr>
      <tr>
        <td><div style="width:548px; border-bottom: #d2d2d2 solid 1px; border-left: #d2d2d2 solid 1px; border-right: #d2d2d2 solid 1px;  background-color: #FFFFFF;">
            <table border="0" cellpadding="0" cellspacing="0" >
              <tr>
                <td align="center" valign="top" background="images/erro3_03.jpg"><img src="images/error3_03.jpg" width="444" height="457" />
                  <p align="right">&nbsp;</p></td>
              </tr>
            </table>
        </div></td>
      </tr>
      <tr>
        <td>&nbsp;</td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td width="25%">&nbsp;</td>
    <td width="75%">&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
<br />
</body>
</html>


MyException.page代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification PUBLIC 
"-//Apache Software Foundation//Tapestry Specification 4.0//EN" 
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">

<page-specification>

</page-specification>

jirabotuo 2008-12-16
谢谢帮忙看下。主要不知道这个异常什么原因造成的。难道是说我的MyException类没有“exception”这个属性。怎么理解呢?
tapestry 2008-12-16
不知道你怎么理解的属性,不过确实你的类里没有exception这个属性,你可以定义抽象的getException()方法,或者直接实现这个方法,抽象的tapestry中叫属性,直接实现的版本是ognl直接调用的。
jirabotuo 2008-12-17
谢谢Tapestry兄,知道原因了。确实是我的MyException类没有exception属性。

因为我定义了一个void setException(Throwable t)方法,可是没有定义相对的返回方法getException()。

于是,我在MyException中定义了个抽象方法:

public abstract Throwable getException();


就可以了。

我想问下Tapestry兄,T4里面对bean是怎么解释的?有相关资料吗?这里采用的方法跟javabean有点类似。
tapestry 2008-12-17
它就是将抽象的getter和setter定义为属性,它会生成个类,实现抽象的getter和setter的方法,并在类中增加那个域,就跟我们自己在bean中加域一样,不过它有自己的属性生命周期管理方法,比如初始化等。
jirabotuo 2008-12-17
理解了。

还想问下Tapestry兄,就是我用Tapestry4.1开发时,刷新当前页面,表单老是重复提交。请问怎么解决呢?

我看了你那篇文章,试过好像不行啊!
jirabotuo 2008-12-17
我的form代码是这样的:
MyHtml.html
<form jwcid="@Form" listener="listener:onSubmit" action="">
<table>
<tr>
<td><input type="submit" onclick="return checkQuForm();" value="提交"/></td>
</tr>
</table>
</form>


listener方法如下:
@InjectPage("ZhuanJiaWenDa")
public abstract ZhuanJiaWenDa getZhuanJiaWenDaPage();
public abstract void setFlag(int flag);	  //操作状态位,1为成功,2为失败
	
public abstract void setMsg(String msg);  //操作提示信息
public IPage onSubmit(){
		ZhuanJiaWenDa page = this.getZhuanJiaWenDaPage();
		if(!this.getCurDVExist()) {
			page.setFlag(2);
			page.setMsg("您尚未登录,无法提交问题!");
			return page;
		}
		QA qa = new QA();
		qa.setQuTitle(this.getQuTitle1());
		qa.setQuestion(com.doone.pcdoctor.util.StringFormat.getHtmlString(this.getQuContent()));
		qa.setUserId(this.getDefaultUserId());
		qa.setNickname(this.getDefaultUser());
		if(this.getQADao().addQA(qa)) {
			page.setFlag(1);
			page.setQuContent(null);
			page.setQuTitle1(null);
			page.setMsg("问题提交成功,我们将尽快联系专家为您解答!");
		}
		else {
			page.setFlag(2);
			page.setMsg("问题提交失败,请稍候再试!");
		}
		return page;
	}


当我提交数据完后,刷新当前页面,数据会重复提交。(因为重复提交了表单,listener方法被调用了2次)。请问用什么方法可以不重复提交表单呢?
tapestry 2008-12-18
不要返回IPage对象,返回ILink对象,这样就是redirect了。
jirabotuo 2008-12-18
返回ILink确实是可以了。

但是我的这句代码没被调用到了。

page.setMsg("您尚未登录,无法提交问题!");
tapestry 2008-12-18
ILink无法设值,它redirect过去后是无状态的。你可以实现IExternalLink,通过参数传值给它。
Global site tag (gtag.js) - Google Analytics