2010-12-12 24 views
10

JSR-303 est-il également prévu pour la validation des paramètres de méthode?Validation des paramètres de méthode avec JSR-303

Si oui, y a-t-il un exemple sur le web? Le plus grand défi auquel je suis confronté est comment obtenir un validateur dans chaque méthode. Avec Spring 3, cela ne signifie-t-il pas que je devrais injecter pratiquement toutes les classes avec un LocalValidatorFactoryBean?

Merci!

Répondre

3

Cela ressemble à un cas d'utilisation pour AOP (AspectJ). Écrivez un pointcut pour les méthodes qui sont annotées avec javax.validation.constraints.*, injectez un validateur dans l'aspect (probablement en utilisant Spring) et utilisez un conseil @Before ou @Around pour effectuer la validation avant l'exécution de la méthode.

Lire AspectJ in Action pour référence.

3

Le javadocs pour chacun des JSR 303 annotations indique ce qui suit:

@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER}) 

Voir, PARAMETER est là. Donc, oui, c'est techniquement possible.

Voici un exemple:

public void method(@NotNull String parameter) { 
    // ... 
} 

Je suis toutefois pas certain que avec Spring intègre depuis que je ne l'utilise pas. Vous pourriez juste essayer.

9

La validation au niveau de la méthode sera prise en charge dans la prochaine version 4.2 de Hibernate Validator, implémentation de référence de JSR 303. Comme indiqué dans la réponse précédente, cela permet de spécifier des annotations de contraintes (intégrées ainsi que des types personnalisés) aux paramètres de la méthode et de renvoyer des valeurs pour spécifier les conditions préalables et postérieures à l'invocation d'une méthode.

Veuillez noter que HV ne traitera que la validation réelle des appels de méthode sans déclencher une telle validation. L'invocation de validation peut être effectuée à l'aide d'AOP ou d'autres moyens d'interception de méthode tels que les proxys dynamiques de JDK. Le problème de JIRA pour ceci est HV-347 [1], donc vous voudrez peut-être vous ajouter comme observateur à ce problème.

[1] http://opensource.atlassian.com/projects/hibernate/browse/HV-347

+0

Je pense que votre blog vient compléter votre réponse;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

Gunnar était assez sympa pour mettre sa solution dans [GitHub] (https://github.com/gunnarmorling/methodvalidation-integration). J'ai bien travaillé pour moi. – Patrick

0

Vous pouvez utiliser jcabi-aspects (Je suis un développeur), qui intègre JSR 303 avec AspectJ. La validation réelle est effectuée par l'une des implémentations JSR 303, que vous devrez ajouter au chemin de la classe, comme Hibernate Validator, ou Apache BVal.

2

Dans Spring 3.1.0, vous pouvez utiliser l'annotation @Validated pour activer la validation sur un pojo. Créez une interface pour la classe pojo et placez-y cette annotation, puis ajoutez vos annotations de validation dans les définitions de méthodes.(L'interface est nécessaire parce que le printemps va créer une classe proxy à l'aide de l'interface comme définition)

@Validated 
public interface PojoClass { 
    public @NotNull String doSomething(@NotEmpty String input); 
} 

votre POJO:

public class PojoClassImpl implements PojoClass { 
    public String doSomething(String input) { 
     return ""; 
    } 
} 

A partir d'une application web standard printemps avec validation actif, pensez à ajouter votre configuration de printemps de cette déclaration de haricot:

<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor"/> 
+0

Pour une raison étrange ConstraintViolationException public \ @NotNull String doSomething(); ne fonctionne pas mais \ @NotNull public String doSomething(); fait. Utilisé la barre pour échapper le symbole At qui a été confus avec l'utilisateur par S.O. – borjab