2015-03-30 1 views
3

Après la validation OmniFaces <o:validateMultiple>, les valeurs <p:inputText> sont perdues.Après OmniFaces o: validateMultiple validation, PrimeFaces p: les valeurs inputText sont perdues avec INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL

Je reporduce problème alors web.xml contient le paramètre javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL:

<context-param> 
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name> 
    <param-value>true</param-value> 
</context-param> 

Si je supprime ce paramètre - tout fonctionne bien.

J'ai vue JSF:

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://xmlns.jcp.org/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:o="http://omnifaces.org/ui"> 

    <h:form id="someForm"> 
     <div> 
      <o:outputLabel for="bar1" value="Bar1" /> 
      <p:inputText id="bar1" /> 
      <p:message for="bar1"/> 
     </div> 
     <div> 
      <o:outputLabel for="bar2" value="Bar2" /> 
      <p:inputText id="bar2" /> 
      <p:message for="bar2"/> 
     </div> 
     <div> 
      <o:outputLabel for="bar3" value="Bar3" /> 
      <h:inputText id="bar3" /> 
      <h:message for="bar3"/> 
     </div> 
     <div> 
      <o:outputLabel for="bar4" value="Bar4" /> 
      <h:inputText id="bar4" /> 
      <h:message for="bar4"/> 
     </div> 
     <o:validateMultiple components="bar1 bar2 bar3 bar4" 
          validator="#{sameValueValidator}" 
          message="All values shold be the same" 
          showMessageFor="bar2 bar4"/> 

     <p:commandButton value="submit" process="@form" update="@form" /> 
    </h:form> 
</html> 

et validateur:

public class SameValueValidator implements MultiFieldValidator { 

    @Override 
    public boolean validateValues(FacesContext context, 
            List<UIInput> components, List<Object> values) { 
     if (!values.isEmpty()) { 
      Object firstValue = values.get(0); 
      for (Object value : values) { 
       if (!Objects.equal(firstValue, value)) { 
        return false; 
       } 
      } 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

Si <o:validateMultiple> validation échoue (textes <p:inputText> composants ne sont pas les mêmes) <p:inputText id="bar1"> et <p:inputText id="bar2"> sont vides, mais <h:inputText id="bar3"> et <h:inputText id="bar4"> garder des valeurs.

Je pense que <p:inputText> ne devrait pas perdre des valeurs ou est-ce que je fais quelque chose de mal?


J'utilise,

  • PrimeFaces 5.1.14 (ou 5.2.RC2)
  • OmniFaces 1.8.1
  • Mojarra 2.2.10
  • Tomcat 8
  • Java 8
+0

Impossible de le reproduire sur PF 5.1 + OF 1.8.1 + Mojarra 2.2.10. Je n'ai pas la version PrimeFaces Elite aux mains, mais je n'ai pas pu la reproduire sur PF 5.2 RC2. Pouvez-vous le reproduire en utilisant PF 5.1 ou 5.2 RC2? Si oui, quelle impl implente/version utilisez-vous? Par ailleurs, OmniFaces a un '' dans le but de valider plusieurs composants sur l'égalité. – BalusC

+0

Oui, je peux reproduire ce problème en utilisant PF RC2, Mojarra 2.2.10. Si je supprime: javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL param de web.xml - alors tout fonctionne bien. - a le même problème – Palladium

Répondre

4

Il app les oreilles que les moteurs de rendu PrimeFaces ont une sorte de raccourci lorsque la valeur soumise est nulle et que l'entrée est invalide alors que "interpréter une chaîne vide comme nulle" est activée, peut-être pour contourner un bug obscur. Vous pouvez le voir dans ComponentUtils#getValueToRender() ci-dessous dans la première déclaration if (numéros de ligne correspondent PF 5.1):

68 if(config.isInterpretEmptyStringAsNull() && submittedValue == null && context.isValidationFailed() && !input.isValid()) { 
69  return null; 
70 } 
71 else if(submittedValue != null) { 
72  return submittedValue.toString(); 
73 } 

Cette partie ne prend pas en compte si le composant a déjà un ensemble de valeur locale. Il pourrait être vérifié par UIInput#isLocalValueSet().

Si vous réécrivez comme ci-dessous, il devrait fonctionner comme prévu:

68 if(config.isInterpretEmptyStringAsNull() && submittedValue == null && !input.isLocalValueSet() && context.isValidationFailed() && !input.isValid()) { 
69  return null; 
70 } 
71 else if(submittedValue != null) { 
72  return submittedValue.toString(); 
73 } 

je pourrais signaler aux gars PF, mais comme vous semblez avoir Pro/accès Elite, vous feriez peut-être mieux faire il.

+1

problème créé https://code.google.com/p/primefaces/issues/detail?id = 8120 & thanks = 8120 & ts = 1427789793 dans le suivi des problèmes de la communauté PF (Seuls les utilisateurs Pro (non Elite) peuvent créer des problèmes) – Palladium

+1

Défaut [Problème PF] (https://code.google.com/p/primefaces/issues/detail?id = 8120 & thanks = 8120 & ts = 1427789793) a été corrigé dans PF 5.2.RC3 (I vérifié). Ainsi que dans 5.15 (pas encore publié) – Palladium