¿Cómo obtener el valor de otro componente en un validador personalizado?

Yo uso un validador personalizado. La dificultad es que solo necesito verificar dos campos inputText y compararlos. El primer campo debe ser mayor que el segundo campo. Si no, entonces tengo que mostrar un mensaje con la información del error. Así que necesito pasar en mi validador personalizado el valor del primer campo inputText. Para hacer esto, necesito leer un valor del primer campo InputText en mi clase de validador. ¿Cómo puedo obtener una identificación del componente necesario en una clase de validador? La solución que usa la etiqueta no me conviene. Necesito ir directamente al componente deseado ¿Tal vez esto se puede hacer a través de cualquier método de FacesContext?

Solo pase el componente completo a través de .

      ...  ...  

(nota: el código de binding es tal cual, ¡NO permita que haga referencia a una propiedad de frijol!)

con en validador

 UIInput endComponent = (UIInput) component.getAttributes().get("endComponent"); Object endComponentValue = endComponent.getSubmittedValue(); // ... 

Una nota importante es que los componentes se procesan, convierten y validan en el orden en que aparecen en el árbol. Cualquier valor enviado de componentes que no se conviertan / validen todavía está disponible por UIInput#getSubmittedValue() y cualquiera de los que ya están convertidos / validados está disponible por UIInput#getValue() . Por lo tanto, en su ejemplo particular, debe obtener el valor de UIInput#getSubmittedValue() lugar de UIInput#getValue() .

Si desea trabajar con el valor ya convertido y validado como disponible por UIInput#getValue() , debe mover el validador al segundo componente y luego pasar el primer componente.

   ...     ...  
 UIInput startComponent = (UIInput) component.getAttributes().get("startComponent"); Object startComponentValue = startComponent.getValue(); // ... 

Ver también:

  • JSF no es compatible con la validación de campo cruzado, ¿hay alguna solución?
  • Error al validar dos campos de entrada de texto juntos
  • Validador para múltiples campos

Puede tomar el valor del otro campo del mapa de parámetros de solicitud utilizando el atributo de nombre del campo de entrada. Para obtener el atributo de nombre del campo de entrada, haga una fuente de vista para ver qué se genera. Vea el ejemplo a continuación.

 public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException { String newPassword = fc.getExternalContext().getRequestParameterMap().get("centerForm:newPassword"); String newPassword2 = (String) o; if(!newPassword.equals(newPassword2)){ FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR,"New Passwords do not match", null); throw new ValidatorException(msg); } }