论坛首页 Java企业应用论坛

Tapestry的<bean>初始化问题

浏览 4289 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2005-10-16  
我要在一个 页面使用一个数字验证,需要用到 BigDecimal类,我看了 workbench的例子,它是这样使用数字验证的:
<component id="inputBigDecimal" type="TextField">
    <binding name="value" value="visit.bigDecimalValue"/>
    <binding name="translator" value="translator:number,pattern=#.#"/>
    <binding name="validators" value="validators:required,min=2,max=100.123456234563456734563456356734567456784567456784567845675678456785678"/>
    <binding name="displayName" value="literal:Big Decimal Field"/>
  </component>

但是我没有 visit类,或者不想创建一个 visit类,所以我定义了一个 Bean,如下:
<bean name="bigDice" class="java.math.BigDecimal">
<set name="var" value="new java.lang.String('1');"/>
</bean>


然后使用它:
<component id="testf" type="TextField">
<binding name="value" value="clientScriptingEnabled"/> 
    <binding name="value" value="bean:bigDice"/>
    <binding name="translator" value="translator:number,pattern=#.#"/>
    <binding name="validators" value="validators:required,min=2,max=100.123456234563456734563456356734567456784567456784567845675678456785678"/>
    <binding name="displayName" value="literal:Big Decimal Field"/>
  </component>


但是的到了Exception:
Unable to instantiate bean 'bigDice' (for component logon); as class java.math.BigDecimal: java.math.BigDecimal 
component: $Logon_812@b05e0f[logon]  
location: context:/html/logon.page, line 26, column 52
21 <binding name="validator" value="bean:testValidator"/>  
22 <binding name="displayName" value="literal:test"/> 
23 </component>  
24  
25 <bean name="bigDice" class="java.math.BigDecimal"> 
26 <set name="var" value="new java.lang.String('1');"/> 
27 </bean> 
28  
29 <component id="testf" type="TextField"> 
30 <binding name="value" value="clientScriptingEnabled"/>  
31 <binding name="value" value="bean:bigDice"/> 
 
   
java.lang.InstantiationException 
java.math.BigDecimal 


他的例子都是使用 tapestry里面的类初始化的,例如:
<bean name="required" class="org.apache.tapestry.form.validator.Required"/>


为什麽换成了 jdk里面的 java.math.BigDecimal就出错呢?多谢!
   发表时间:2005-10-16  
Tapestry里的bean好像必须有空的默认构造函数,这样才能创建bean,BigDecimal类没有默认的空的构造函数,所以没法实例化。
0 请登录后投票
   发表时间:2005-10-16  
从出的例外来看,可能是这个问题,那末在这种情况下怎样解决呢? 正确初始化方法是什麽?谢谢
0 请登录后投票
   发表时间:2005-10-16  
而且例子里面的 这句:
<binding name="value" value="visit.bigDecimalValue"/> 

其中的 visit不知道是哪里来的,在 *.application中也没有找到 这个变量。 只是在Visit.java里面看到了 bigDecimalValue 的定义.
0 请登录后投票
   发表时间:2005-10-17  
1、value="visit.bigDecimalValue"相当于getVisit().getBigDecimalValue(),每一个Page页面都有getVisit()方法。
2、验证类的编写需要继承Validator接口,例如
public class PatronCodeValidator implements Validator {
private KnownPatrons knownPatrons;
public void setKnownPatrons(KnownPatrons knownPatrons) {
this.knownPatrons = knownPatrons;
}
public void validate(
IFormComponent field,
ValidationMessages messages,
Object object) throws ValidatorException {
String patronId = (String) object;
if (!knownPatrons.isKnown(patronId)) {
throw new ValidatorException("Patron not found", null);
}
}
public boolean getAcceptsNull() {
return false;
}
public void renderContribution(
IMarkupWriter writer, IRequestCycle cycle,
FormComponentContributorContext context, IFormComponent field) {
}
public boolean isRequired() {
return false;
}
bean的定义:
&lt;bean name="patronCodeValidator" class="com.ttdev.postage.PatronCodeValidator"&gt;
&lt;set name="knownPatrons" value="ognl:knownPatrons"/&gt;
&lt;/bean&gt;
使用:
&lt;component id="patronCode" type="TextField"&gt;
&lt;binding name="value" value="patronCode"/&gt;
&lt;binding name="validators" value="bean:patronCodeValidator"/&gt;
&lt;/component&gt;

注:这个例子不是可运行的例子,摘自:Enjoying Web Development with Tapestry
你可以从http://www.agileskills2.org/EWDT/处下载。
0 请登录后投票
   发表时间:2005-10-17  
变通的办法:
&lt;property name="bigDice" initial-value="ognl:new java.math.BigDecimal(xxx)"&gt;



..

&lt;binding name="value" value="clientScriptingEnabled"/&gt;
    &lt;binding name="value" value="ognl:bigDice"/&gt;
...




不得已的办法。没有了managed bean的延迟加载的好处了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics