我目前在Apache Tapestry 5.3.1中遇到以下问题: 用户应该能够编辑他的个人资料详细信息并更改他的密码。 对于数据,有一个“用户”实体。
我无法使用用户的getPassword方法,因为密码是使用随时更改的salt加密存储的(使用Apache Tynamo)。因此,我试图将值存储在名为passwordValue1和passwordValue2的两个页面属性中,并使用bean的其余部分。 在验证时,即使我输入了某些内容然后提交了表单,passwordValue字段也为空。 有什么想法吗?
<t:beaneditform object="currentUserInfo" add="password1,password2" t:id="registerForm"
exclude="username,password,accountLocked,credentialsExpired">
<p:password1>
<t:label for="password1" >Passwort</t:label>
<t:passwordfield t:id="password1" value="passwordValue1" validate="password"/>
</p:password1>
<p:password2>
<t:label for="password2" >Passwort wiederholen</t:label>
<t:passwordfield t:id="password2" value="passwordValue2" validate="password"/>
</p:password2>
</t:beaneditform>
tapestry页面的java代码:
@RequiresUser
public class UserDetails {
@InjectPage
private Index index;
@Inject
UserUtility userUtil;
@Inject
private Session session;
@Inject
@Property
@SessionState(create = false)
private User currentUserInfo; //value is set
@Component(id="password1")
private PasswordField password1;
@Component(id="password2")
private PasswordField password2;
@Property
private String passwordValue2;
@Property
private String passwordValue1;
@InjectComponent
private BeanEditForm registerForm;
//...snip....
void onValidate() {
System.out.println("onvalidate");
if (registerForm.getHasErrors()) {
return;
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// both passwordValue1 and passwordValue 2 are null here
if ((passwordValue1 == null && !("".equals(passwordValue1))
|| !passwordValue1.equals(passwordValue2))) {
registerForm.recordError(password1, "Passwords must match");
registerForm.recordError(password2, "Passwords must match");
}
}
答案 0 :(得分:3)
您的验证方法未指定要验证的内容。 将方法重命名为 onValidateFromRegisterForm
说明: 每个字段也会触发一个validate事件,因此会为每个字段调用它。在设置字段后立即触发这些验证。 因此,当设置第一个字段时,将调用onValidate并检查BOTH字段,但当然,所有其他字段尚未设置并且验证失败。
这可能有助于:What is called when在快速入门页面上。