tutorial subir servidor javaserverfaces español ejemplo archivos jsf error-handling facelets

subir - upload file jsf



¿Cómo mostrar los errores de mi aplicación en JSF? (8)

Intenté esto como la mejor suposición, pero no tuve suerte:

Me parece bien. ¿Has intentado configurar la severidad de un mensaje explícitamente? También creo que la ID debe ser la misma que la de un componente (es decir, necesitaría utilizar la nueva Contraseña1 o la Contraseña nueva2, si esas son sus ID, y no la Contraseña nueva como lo hizo en el ejemplo).

FacesContext.getCurrentInstance().addMessage("newPassword1", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message"));

Luego use <h:message for="newPassword1" /> para visualizar el mensaje de error en la página JSF.

En mi aplicación JSF / Facelets, aquí hay 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 basada en algo que sucede en el método continueButton (). Se deben mostrar diferentes errores para newPassword y newPassword2. Un validador no funcionará realmente, porque el método que entregará los resultados (desde el DB) 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 donde necesito mostrar diferentes mensajes de error. Cuando probé esto, la página muestra duplicados de cada mensaje.

Intenté esto como la mejor suposición, pero no tuve 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ía apreciada!


En caso de que alguien tuviera curiosidad, ¡pude resolver esto en base a todas sus respuestas combinadas!

Esto está en el 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>

Esto está en el método continueButton ():

FacesContext.getCurrentInstance().addMessage("myForm:newPassword1", new FacesMessage(PASSWORDS_DONT_MATCH, PASSWORDS_DONT_MATCH));

¡Y funciona! ¡Gracias por la ayuda!


Encontrado this mientras busca en Google. La segunda publicación hace un punto sobre las diferentes fases de JSF, lo que podría estar causando la pérdida de su mensaje de error. Además, pruebe null en lugar de "newPassword" porque no tiene ningún objeto con la id newPassword.


JSF es una bestia. Me puede estar faltando algo, pero 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}" />


Recuerda eso:

FacesContext context = FacesContext.getCurrentInstance(); context.addMessage( null, new FacesMessage( "The message to display in client" ));

también es válido, porque cuando se especifica null como primer parámetro, se aplica a la forma completa.

Más información: coreservlets.com // Outdated


Respuesta simple, si no necesita vincularlo a un componente específico ...

Java:

FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Authentication failed", null); FacesContext context = FacesContext.getCurrentInstance(); context.addMessage(null, message);

XHTML:

<h:messages></h:messages>


También debe incluir el FormID en su llamada a addMessage ().

FacesContext.getCurrentInstance().addMessage("myform:newPassword1", new FacesMessage("Error: Your password is NOT strong enough."));

Esto debería funcionar.

Saludos.


FacesContext.addMessage (String, FacesMessage) requiere el ID de cliente del componente, no su ID . Si se pregunta por qué, piense en tener un control como elemento secundario de una tabla de datos, eliminando los diferentes valores con el mismo control para cada fila, sería posible imprimir un mensaje diferente para cada fila. La identificación es siempre la misma; el ID de cliente es único por fila.

Por lo tanto, "myform: mybutton" es el valor correcto, pero esto no es aconsejable. Una búsqueda crearía menos acoplamiento entre la vista y la lógica comercial y sería un enfoque que funciona en entornos más restrictivos, como los portlets.

<f:view> <h:form> <h:commandButton id="mybutton" value="click" binding="#{showMessageAction.mybutton}" action="#{showMessageAction.validatePassword}" /> <h:message for="mybutton" /> </h:form> </f:view>

Lógica manejada del frijol:

/** 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; } }