web-dev-qa-db-fra.com

Bean Validation @NotNull, @NotBlank et @NotEmpty ne fonctionne pas dans JSF + Tomcat

J'utilise des annotations Hibernate Validation dans mon bean géré JSF. Lorsque j'utilise @NotNull, @NotBlank ou @NotEmpty ils ne semblent en aucun cas être déclenchés.

@NotBlank(message = "{name.required}")
public String name;

Vue:

<h:outputLabel value="Name:" /> 
<h:inputText id="name" value="#{person.name}" size="20" />
<h:message for="name" style="color:red" />

Comment cela est-il causé et comment puis-je le résoudre?

27
Mahmoud Saleh

Introduction

Étant donné que vous n'avez donné aucun commentaire sur mon commentaire avec la question de savoir quel conteneur vous utilisez, j'ai jeté un œil dans votre historique de questions pour savoir quels conteneurs vous utilisez tous. Pour l'instant, je n'ai trouvé que Tomcat . Donc, pour cette réponse, je suppose que vous utilisez effectivement Tomcat comme je l'avais initialement supposé lors de la publication du commentaire.

Assurez-vous d'installer tous les fichiers JAR

Tomcat n'est livré avec aucune implémentation/API de validation de bean JSR303. Vous devez télécharger et installer vous-même. Le fait que vous ayez ces annotations à compiler signifie que vous avez correctement supprimé le fichier hibernate-validator.jar (Le nom peut différer selon la version) dans le dossier /WEB-INF/lib De votre application Web. Le fait que ces annotations ne semblent à leur tour fonctionner en aucune façon peut simplement signifier que vous n'avez pas lu le readme.txt Et/ou oublié d'ajouter les fichiers JAR du dossier /lib/required Du validateur Hibernate fichier Zip/tgz de la bibliothèque: slf4j-api.jar et validation-api.jar. La dernière est obligatoire pour que les annotations fonctionnent réellement. Donc, pour que Hibernate Validator fonctionne dans Tomcat, vous avez besoin des fichiers JAR suivants dans /WEB-INF/lib De la webapp:

  • validation-api.jar (Contient l'API abstraite et le scanner d'annotations)
  • hibernate-validator.jar (Contient l'implémentation concrète)
  • slf4j-api.jar (Juste pour que son enregistreur fonctionne également)

De cette façon @NotBlank et @NotEmpty doit fonctionner. Le @NotNull mérite une attention particulière; les champs de saisie vides sont notamment reçus par défaut sous forme de chaînes vides du client (webbrowser) en raison de la nature des paramètres de requête HTTP. Les chaînes vides ne sont pas identiques à null, donc @NotNull par défaut ne se déclenchera jamais. JSF est cependant configurable pour les interpréter comme null en ajoutant simplement le paramètre de contexte suivant à web.xml:

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

De cette façon, le @NotNull doit également fonctionner.

BV fonctionne mais seulement les champs vides pas

Si cela encore ne fonctionne pas (c'est-à-dire qu'aucune des 3 annotations ne fonctionne, mais d'autres comme @Size(min=5) pour une longueur minimale de 5 fonctionne très bien ), alors les chances sont grandes que vous ayez également le paramètre de contexte suivant dans web.xml:

<context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>false</param-value>
</context-param>

Vous devez ensuite le supprimer (par défaut, il est auto, c'est-à-dire uniquement lorsque l'API JSR303 Bean Validation se trouve dans le chemin d'accès aux classes d'exécution) ou le définir sur true.

BV ne fonctionne pas du tout

Quand en fait rien de BV ne fonctionne, pas non plus @Size , @Pattern , etc., alors vous devriez vérifier si vous le faites pas les éléments suivants dans votre formulaire:

<f:validateBean disabled="true" />

Vous devez ensuite le supprimer (il sera juste par défaut activé) ou définir disabled="false".

Assurez-vous d'utiliser la dernière version de Mojarra

Lorsque BV encore ne fonctionne pas, vérifiez si vous n'utilisez pas une ancienne version de Mojarra entre 2.2.3 et 2.2.6. Ces versions avaient un bogue de délégué de chargement de classe qui rendait complètement la validation de bean sur Tomcat et les clones complètement invisible. Ceci est signalé comme Mojarra issue 318 et corrigé dans Mojarra 2.2.7.

66
BalusC

J'ai eu un problème similaire et j'ai pu surmonter le problème en incluant les trois pots ci-dessous dans web-inf lib. Ajoutez simplement le fichier de validation hibernate et les fichiers requis comme indiqué dans le fichier Zip:

  • hibernate-validator-4.3.0.Final.jar
  • jboss-logging-3.1.0.CR2.jar
  • validation-api-1.0.0.GA.jar
4
abhi