PrimeFaces validador no activado

ya que fileLimit no existe en las primas 3.4 más Estoy intentando solucionar el problema al implementar un validador, el problema es que el método de validación nunca se invoca. Ese es mi Validador:

@FacesValidator(value ="fileLimitValidator") public class FileLimitValidator implements Validator { @Override public void validate(final FacesContext context, final UIComponent component, final Object value) throws ValidatorException { final String fileLimit = (String)component.getAttributes().get("fileLimit"); final String size = (String)component.getAttributes().get("size"); if (fileLimit!=null && size!=null) { if (Integer.valueOf(size) >= Integer.valueOf(fileLimit)) { FacesUtils.throwErrorExceptionFromComponent(component,"fichero_confidencialidad_error"); } } } } 

y en mi facelet lo he intentado:

  

y:

  

y:

  

y:

  

pero el método de validar nunca se llama. ¿Cuál es la forma correcta de hacerlo?

De acuerdo con el código fuente de FileUpload y FileUploadRenderer , el validador solo se invoca cuando se usa mode="simple" (nota: esto a su vez requiere ajax="false" en el comando). El modo avanzado no configurará el archivo cargado como el valor enviado por el componente, lo que hará que permanezca null hasta que se invoque el método de escucha. Siempre que el valor enviado sea null , los validadores no se invocan.

No estoy seguro de si esto es intencional. Teóricamente, debería ser posible configurar UploadedFile como valor enviado y tener el validador para confiar en él. Es posible que desee crear un informe de mejora en el rastreador de problemas PrimeFaces .

Mientras tanto, a pesar de ser una práctica pobre , tu mejor fileUploadListener es realmente realizar la validación en el método fileUploadListener . Simplemente puede desencadenar FacesContext validación para agregar mensajes de caras a través de FacesContext siguiente manera:

 if (fail) { context.validationFailed(); context.addMessage(event.getComponent().getClientId(context), new FacesMessage( FacesMessage.SEVERITY_ERROR, messageSummary, messageDetail)); } 

De lo contrario, necesitarías crear un renderizador personalizado para que establezca el valor enviado durante la decode() (sin embargo, no garantizo que funcione en la práctica, tal vez tropezarás con un peculiar problema que puede ser la razón por la cual PrimeFaces no lo implementó inicialmente así).

Por cierto, su primer y segundo bash de validador son correctos. El tercer bash solo funciona si usó @ManagedBean lugar de @FacesValidator ( que a menudo se realiza cuando la inyección de un @EJB es obligatoria, lo que no es posible en @FacesValidator ). El cuarto bash no es válido.

Para validar una carga de archivo de primefaces requerida en modo avanzado (ajax) es posible usar esto:

    

Donde la implementación del método bean.processValidations() sería algo bean.processValidations() :

 public void processValidations() { FacesContext context = FacesContext.getCurrentInstance(); UIInput fileUploadComponent = fileUploadsBean.getFileUploadComponent(); if (fileUploadComponent!=null && !isFileUploaded()) { fileUploadComponent.setValid(false); context.addMessage(fileUploadComponent.getClientId(context), new FacesMessage(FacesMessage.SEVERITY_ERROR, messageSummary, messageDetail)); context.validationFailed(); } } 

Donde fileUploadsBean sería un bean CDI con ámbito REQUEST (no funcionará con los ManagedBeans JSF estándar) que usted inyecta a su bean que tiene el método processValidations() definido, el método fileUploadsBean.getFileUploadComponent() devuelve el componente de carga del archivo de fileUploadsBean.getFileUploadComponent() (lo hará use para eso). El método isFileUploaded() determinará si el archivo se ha subido o no (probablemente solo una comprobación nula de una variable miembro que se completa desde fileUploadListener).

Si desea resaltar el botón de carga de archivos, puede agregar condicionalmente un styleClass que luego puede usar para agregar un borde rojo, por ejemplo.

 styleClass="#{fileUploadsBean.fileUploadComponent.valid ? '' : 'validationFailed'}" 

Como resultado, se mostrará el mensaje de validación fallida para la carga del archivo de primefaces junto con todos los demás mensajes de validación de jsf. Puede tener problemas para mantener el orden de los mensajes de validación (siempre al final), pero aún así supera la validación del archivo de carga fallida después de que el usuario manejó todos los mensajes de validación de jsf estándar de diferentes campos y su acción en un bean de respaldo finalmente ha sido alcanzado.