Гобелен 5: Значение поля пароля не привязано к переменной
В настоящее время у меня возникает следующая проблема с Apache Tapestry 5.3.1: пользователь должен иметь возможность редактировать данные своего профиля и менять свой пароль. Для данных существует сущность "Пользователь".
Я не могу использовать метод getPassword пользователя, так как пароли хранятся в зашифрованном виде с солью, которая всегда изменяется (используя Apache Tynamo). В результате я пытаюсь сохранить значения в двух свойствах страницы с именами passwordValue1 и passwordValue2 и использовать остальную часть компонента. При проверках оба поля passwordValue имеют значение null, даже если я что-то набрал, а затем отправил форму. Есть идеи почему?
<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>
Код 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");
}
}
1 ответ
Ваш метод проверки не указывает, что вы хотите проверить. Переименуйте метод в onValidateFromRegisterForm
Объяснение: Каждое поле также вызывает событие проверки, поэтому оно вызывается для каждого поля. Эти проверки запускаются сразу после установки поля. Поэтому, когда первое поле установлено, вызывается onValidate, и он проверяет ОБА поля, но, конечно, все остальные поля еще не установлены и не проходят проверку.
Это может помочь: что называется, когда на странице Jumpstart.