3 votes

Comportement étrange de Primefaces Dynaform avec f:validateLength

Je suis actuellement dans un projet de création de formulaire dynamique, utilisant Primefaces 8.0 et Primefaces Extension 8.0. Je veux faire une validation de longueur dans la saisie de l'utilisateur pour le numéro de téléphone avec une longueur minimum et maximum en utilisant f:validateLength, mais d'une manière ou d'une autre la validation échoue toujours en disant que la longueur est plus grande que celle autorisée même si j'ai fixé le maximum à 10 et que j'ai juste entré 1 caractère. Voici mon code

xhtml :

<h:form prependId="false">
            <p:messages/>
            <pe:dynaForm id="df" 
                         value="#{testMBean.modelz}" var="data" 
                         class="ui-fluid" style="width: 100%;" varContainerId="dfid">
                <pe:dynaFormControl id="dfc-text" type="Text" style="white-space: normal;">
                    <p:panelGrid id="pg-txt" columns="3" layout="grid" class="no-padding no-border"
                                 styleClass="ui-panelgrid-blank form-group"
                                 columnClasses="ui-grid-col-4,ui-grid-col-8,ui-grid-col-2">
                        <p:outputLabel for="@next" 
                                       value="#{data.labelEn}"/>
                        <p:inputText id="txt" value="#{data.value}" required="false">
                            <f:validateLength for="@previous" minimum="#{data.minLength}" maximum="#{data.maxLength}"/>
                        </p:inputText>
                        <p:outputLabel value="#{data.minLength} - #{data.maxLength}"/>
                    </p:panelGrid>
                </pe:dynaFormControl>
            </pe:dynaForm>
            <p:commandButton process="@form" update="@form"/>
</h:form>

TestMBean :

private DynaFormModel modelz;

modelz = new DynaFormModel();
DynaFormRow row = modelz.createRegularRow();
DynamicModel dm = new DynamicModel();
dm.setMinLength(0);
dm.setMaxLength(10);
dm.setLabelEn("Test");
row.addControl(dm, "Text");
dm = new DynamicModel();
dm.setMinLength(1);
dm.setMaxLength(20);
dm.setLabelEn("Test2");
row.addControl(dm, "Text");

DynamicModel :

@Getter
@Setter
@ToString
public class DynamicModel implements Serializable {
    private String labelEn;
    private Object value;
    private Integer minLength;
    private Integer maxLength;
}

Le résultat : It's said that the maximum allowed value is 0.

Il est dit que la valeur maximale autorisée est 0 mais comme vous pouvez le voir, j'affiche les valeurs de minLength et maxLength et il apparaît que la minLength est 0 et la maxLength est 10. J'ai donc vérifié la source et j'ai obtenu ceci : Yes it shows 0 for both min and max Length

Est-ce que je fais quelque chose de mal ? Quelqu'un peut-il m'indiquer où je me suis trompé ? Merci.

0voto

Blablabla Points 135

J'ai résolu le problème en utilisant un validateur personnalisé qui prolonge javax.faces.validator.LengthValidator con f:attribute pour définir la valeur minimale et maximale.

Créer TextValidator qui prolonge javax.faces.validator.LengthValidator pour intercepter les attributs :

public class TextValidator extends LengthValidator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value)
            throws ValidatorException {
        if (value != null && !value.toString().trim().isEmpty()) {
            Object minimum = component.getAttributes().get("minimum");
            Object maximum = component.getAttributes().get("maximum");
            setMinimum(minimum != null ? Integer.valueOf(minimum.toString()) : 0);
            setMaximum(maximum != null ? Integer.valueOf(maximum.toString()) : 0);
        }
        super.validate(context, component, value);
    }

}

TestMBean :

TextValidator textValidator = new TextValidator();
modelz = new DynaFormModel();
DynaFormRow row = modelz.createRegularRow();
DynamicModel dm = new DynamicModel();
dm.setMinLength(0);
dm.setMaxLength(10);
dm.setLabelEn("Test");
row.addControl(dm, "Text");
dm = new DynamicModel();
dm.setMinLength(2);
dm.setMaxLength(20);
dm.setLabelEn("Test2");
row.addControl(dm, "Text2");

Puis lier textValidator a f:validator dans le xhtml :

<h:form prependId="false">
        <p:messages/>
        <pe:dynaForm id="df" 
                     value="#{testMBean.modelz}" var="data" 
                     class="ui-fluid" style="width: 100%;" varContainerId="dfid">
            <pe:dynaFormControl id="dfc-text" type="Text" style="white-space: normal;">
                <p:panelGrid id="pg-txt" columns="3" layout="grid" class="no-padding no-border"
                             styleClass="ui-panelgrid-blank form-group"
                             columnClasses="ui-grid-col-4,ui-grid-col-8,ui-grid-col-2">
                    <p:outputLabel for="@next" 
                                   value="#{data.labelEn}"/>
                    <p:inputText id="txt" value="#{data.value}" required="false">
                        <f:validator binding="#{testMBean.textValidator}"/>
                        <f:attribute name="minimum" value="#{data.minLength}"/>
                        <f:attribute name="maximum" value="#{data.maxLength}"/>
                    </p:inputText>
                    <p:outputLabel value="#{data.minLength} - #{data.maxLength}"/>
                </p:panelGrid>
            </pe:dynaFormControl>
            <pe:dynaFormControl id="dfc-text2" type="Text2" style="white-space: normal;">
                <p:panelGrid id="pg-txt2" columns="3" layout="grid" class="no-padding no-border"
                             styleClass="ui-panelgrid-blank form-group"
                             columnClasses="ui-grid-col-4,ui-grid-col-8,ui-grid-col-2">
                    <p:outputLabel for="@next" 
                                   value="#{data.labelEn}"/>
                    <p:inputText id="txt2" value="#{data.value}" required="false">
                        <f:validator binding="#{testMBean.textValidator}"/>
                        <f:attribute name="minimum" value="#{data.minLength}"/>
                        <f:attribute name="maximum" value="#{data.maxLength}"/>
                    </p:inputText>
                    <p:outputLabel value="#{data.minLength} - #{data.maxLength}"/>
                </p:panelGrid>
            </pe:dynaFormControl>
        </pe:dynaForm>
        <p:commandButton process="@form" update="@form"/>
    </h:form>

Voici le résultat si la validation échoue : enter image description here

Et voici si la valeur passe la validation : enter image description here

Merci de cette réponse

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X