2013-07-07 2 views
2

J'ai beaucoup lu sur l'API de validation de Bean qui accompagne Java EE 6+ et je comprends les bases du fonctionnement de l'API de validation, mais dans la documentation que j'ai lue, tous les les exemples sont des tests unitaires qui ne m'aident pas à comprendre O WH implémenter les opérations de validation.La validation du bean avec EJB

Je développe un système d'architecture à trois niveaux. Je voudrais placer la validation à la couche de service, ainsi je peux réutiliser le code de validation si la couche de présentation diffère (c'est-à-dire Jax-RS, JSF, etc.). Mais je suis confus sur la façon de mettre en œuvre ces opérations. Voici où je suis coincé:

J'ai des haricots qui interagissent avec les différentes entités de mon modèle. Par exemple ceci est une méthode dans mon haricot pour l'interaction utilisateur ->

public User getUser(
      @Min(value = 0, message = "Must have a positive userId") int uid) 
      throws RetrievalNotFoundException { 

     try { 

      // I WANT TO VALIDATE UID HERE 

      // find User with provided uid 
      User foundUser = em.find(User.class, uid); 

      // IF the user is inactive 
      if (foundUser.getIsActive() == 0) { 
       // cannot find the content 
       throw new RetrievalNotFoundException(); 
      } 

      // close the entity manager 
      em.close(); 
      // return the user 
      return foundUser; 


    } 

Voici l'exemple de la documentation de mise en veille prolongée:

Car object = new Car("Morris"); 
Method method = Car.class.getMethod("drive", int.class); 
Object[] parameterValues = { 80 }; 
Set<ConstraintViolation<Car>> violations = executableValidator.validateParameters(
     object, 
     method, 
     parameterValues 
); 

assertEquals(1, violations.size()); 
Class<? extends Annotation> constraintType = violations.iterator() 
     .next() 
     .getConstraintDescriptor() 
     .getAnnotation() 
     .annotationType(); 
assertEquals(Max.class, constraintType); 

Suis-je vraiment censé instatiate le nouveau haricot pour accéder à sa méthode getUser()? Je suis confus. Une autre question que j'avais était ce qui se passe si quelqu'un décide de mettre dans un int pour l'uid qui déborde le conteneur int? Comment pourrais-je valider cela? Merci beaucoup pour votre aide, Je l'apprécie vraiment.

Répondre

4

Quelques commentaires à votre question. Tout d'abord, la validation du bean fait effectivement partie de EE 6 et EE 7. Cependant, EE 6 ne comprend que Bean Validation 1.0, tandis que EE 7 inclut Bean Validation 1.1. La différence est que Bean Validation 1.0 n'inclut pas encore la validation de méthode et c'est ce que vous montrez dans vos exemples. Hibernate Validator contient depuis la version 4 une API de validation de méthode spécifique Hibernate Validator, mais cela ne fait pas partie de la norme et diffère légèrement de ce qui est spécifié dans Bean Validation 1.1 et Hibernate Validator 5.

Le deuxième commentaire concerne le code nécessaire exécuter la validation de la méthode. La validation du bean fournit uniquement le mécanisme pour effectuer la validation au niveau de la méthode. C'est l'API à laquelle vous faites référence dans votre exemple. Dans la plupart des cas, vous avez besoin d'une sorte de technologie d'interception pour l'utiliser. Java EE 7 par exemple fait la validation de méthode par défaut en utilisant des intercepteurs CDI. Cela fait partie de la norme. Voir http://beanvalidation.org/1.1/spec/#integration-cdi. Si vous voulez utiliser EE 6, vous devrez écrire votre propre logique d'interception en utilisant la technologie de votre choix.

Concernant votre dernière question. Je ne pense pas qu'un débordement soit détectable en général. Il n'y a rien que la validation de Bean peut faire dans ce cas.

+0

Merci, beaucoup d'informations utiles là-dedans. En fait, j'utilise Java EE 7 avec glassfish 4.0 environnement d'exécution. Je pense que la validation au niveau de la méthode est faite par défaut comme vous l'avez dit. Je pense que je devrais écrire mes propres validateurs, puis pour les méthodes avec des listes de paramètres plus longues, afin de ne pas intégrer toutes les contraintes sur les paramètres. Merci pour votre aide! –

+1

Correct, EE7 avec Glassfish 4 a la validation de la méthode activée selon la section de spécification I mentionnée. En ce qui concerne les contraintes personnalisées, vous pouvez certainement créer vos propres contraintes, mais je ne vois pas comment cela réduit la quantité d'annotations. Sauf si vous voulez combiner plusieurs contraintes en une seule contrainte de composition. Cela réduirait bien sûr la quantité d'annotation à placer sur les paramètres. – Hardy

Questions connexes