Как отобразить ошибки моего приложения в JSF?
в моем приложении JSF / Facelets вот упрощенная версия части моей формы:
<h:form id="myform">
<h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
<h:message class="error" for="newPassword1" />
<h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
<h:message class="error" for="newPassword2" />
<h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>
Я хотел бы иметь возможность назначить ошибку определенному тегу H:message на основе чего-то, что происходит в методе continueButton (). Для newPassword и newPassword2 должны отображаться различные ошибки. Валидатор на самом деле не будет работать, потому что метод, который будет доставлять результаты (из БД), выполняется в методе continueButton() и слишком дорог для запуска дважды.
I не удается использовать тег H:messages, потому что на странице есть несколько мест, где мне нужно отображать разные сообщения об ошибках. Когда я попробовал это, на странице отображались дубликаты каждого сообщения.
я попробовал это как лучшее предположение, но не повезло:
public Navigation continueButton() {
...
expensiveMethod();
if(...) {
FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough."));
}
}
что я упустил? Любая помощь будет оценена!
8 ответов
FacesContext.addMessage (строка, FacesMessage) требуется компонент параметр ClientID, не это id. Если вам интересно, почему, подумайте о том, чтобы иметь элемент управления как дочерний элемент dataTable, штампуя разные значения с одним и тем же элементом управления для каждой строки - можно было бы напечатать другое сообщение для каждой строки. The id всегда одно и то же;параметр ClientID уникально в строку.
Так "myform:mybutton" -правильное значение, но жесткое кодирование этого не рекомендуется. Поиск создаст меньше связи между представлением и бизнес-логикой и будет подход, который работает в более ограничительных средах, таких как портлеты.
<f:view>
<h:form>
<h:commandButton id="mybutton" value="click"
binding="#{showMessageAction.mybutton}"
action="#{showMessageAction.validatePassword}" />
<h:message for="mybutton" />
</h:form>
</f:view>
управляемая логика bean:
/** Must be request scope for binding */
public class ShowMessageAction {
private UIComponent mybutton;
private boolean isOK = false;
public String validatePassword() {
if (isOK) {
return "ok";
}
else {
// invalid
FacesMessage message = new FacesMessage("Invalid password length");
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(mybutton.getClientId(context), message);
}
return null;
}
public void setMybutton(UIComponent mybutton) {
this.mybutton = mybutton;
}
public UIComponent getMybutton() {
return mybutton;
}
}
в случае, если кому-то было любопытно, я смог понять это на основе всех ваших ответов вместе взятых!
это в Facelet:
<h:form id="myform">
<h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" />
<h:message class="error" for="newPassword1" id="newPassword1Error" />
<h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" />
<h:message class="error" for="newPassword2" id="newPassword2Error" />
<h:commandButton value="Continue" action="#{createNewPassword.continueButton}" />
</h:form>
это в методе continueButton ():
FacesContext.getCurrentInstance().addMessage("myForm:newPassword1", new FacesMessage(PASSWORDS_DONT_MATCH, PASSWORDS_DONT_MATCH));
и это работает! Спасибо за помощь!
вы также должны включить FormID в вызов addMessage ().
FacesContext.getCurrentInstance().addMessage("myform:newPassword1", new FacesMessage("Error: Your password is NOT strong enough."));
это должно сделать трюк.
С уважением.
помните, что:
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage( null, new FacesMessage( "The message to display in client" ));
также допустимо, потому что когда null указан в качестве первого параметра, применяется ко всей форме.
Подробнее: coreservlets.com //устаревших
JSF-это зверь. Возможно, мне чего-то не хватает, но я использовал для решения подобных проблем сохранение желаемого сообщения в свойство компонента, а затем отображение свойства через outputText:
<h:outputText
value="#{CreateNewPasswordBean.errorMessage}"
render="#{CreateNewPasswordBean.errorMessage != null}" />
нашел этой а погуглить. Во втором сообщении говорится о различных фазах JSF, которые могут привести к потере вашего сообщения об ошибке. Кроме того, попробуйте null вместо "newPassword", потому что у вас нет объекта с идентификатором newPassword.
я попробовал это как лучшее предположение, но не повезло:
мне кажется, это правильно. Вы пытались явно задать серьезность сообщения? Также я считаю, что идентификатор должен быть таким же, как у компонента (т. е. вам нужно будет использовать newPassword1 или newPassword2, если это ваши идентификаторы, а не newPassword, как в Примере).
FacesContext.getCurrentInstance().addMessage("newPassword1",
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message"));
затем использовать <h:message for="newPassword1" />
для отображения сообщения об ошибке на странице JSF.
простой ответ, Если вам не нужно привязывать его к определенному компоненту...
Java:
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Authentication failed", null);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, message);
XHTML:
<h:messages></h:messages>