En mi aplicación JSF/Facelets, he aquí una versión simplificada de parte de mi formulario:
<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>
Me gustaría poder asignar un error a una etiqueta h:message específica basándome en algo que ocurra en el método continueButton(). Es necesario mostrar errores diferentes para newPassword y newPassword2. Un validador no funcionará realmente, porque el método que entregará los resultados (de la BD) se ejecuta en el método continueButton(), y es demasiado caro para ejecutarse dos veces.
No puedo usar la etiqueta h:messages porque la página tiene varios lugares en los que necesito mostrar diferentes mensajes de error. Cuando probé esto, la página mostraba duplicados de cada mensaje.
Probé esto como mejor opción, pero no hubo suerte:
public Navigation continueButton() {
...
expensiveMethod();
if(...) {
FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough."));
}
}
¿Qué me estoy perdiendo? ¡Cualquier ayuda será apreciada!
JSF es una bestia. Puede que me esté perdiendo algo, pero yo solía resolver problemas similares guardando el mensaje deseado en una propiedad del bean, y luego mostrando la propiedad a través de un outputText:
<h:outputText
value="#{CreateNewPasswordBean.errorMessage}"
render="#{CreateNewPasswordBean.errorMessage != null}" />
Encontré esto mientras buscaba en Google. El segundo post hace una puntualización sobre las diferentes fases de JSF, que puede estar causando que tu mensaje de error se pierda. Además, prueba con null en lugar de "newPassword" porque no tienes ningún objeto con el id newPassword.
He intentado esto como una mejor suposición, pero no hubo suerte:
A mí me parece correcto. ¿Has probado a establecer explícitamente la gravedad del mensaje? También creo que el ID tiene que ser el mismo que el de un componente (es decir, tendría que usar newPassword1 o newPassword2, si esos son sus IDs, y no newPassword como tenía en el ejemplo).
FacesContext.getCurrentInstance().addMessage("newPassword1",
new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message"));
A continuación, utilice <h:message for="newPassword1" />
para mostrar el mensaje de error en la página JSF.