2010-12-12 4 views
10

Ist JSR-303 auch für die Validierung von Methodenparametern gedacht?Methode Parameter Validierung mit JSR-303

Wenn ja, gibt es ein Beispiel im Internet? Die größte Herausforderung, vor der ich stehe, ist, wie man innerhalb jeder Methode einen Validator bekommt. Mit Spring 3, heißt es nicht, dass ich praktisch jede Klasse mit einer LocalValidatorFactoryBean injizieren müsste?

Danke!

Antwort

3

Das klingt wie ein Anwendungsfall für AOP (AspectJ). Schreiben Sie einen Pointcut für Methoden, die mit javax.validation.constraints.* annotiert sind, injizieren Sie einen Validator in den Aspekt (wahrscheinlich mit Spring) und verwenden Sie einen @Before oder @Around Hinweis, um die Validierung vor der Ausführung der Methode durchzuführen.

Lesen Sie AspectJ in Action als Referenz.

3

Die javadocs für jede der JSR 303 Anmerkungen sagt der folgende:

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

See, PARAMETER ist. Also, ja, es ist technisch möglich.

Hier ist ein Beispiel:

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

ich aber bin nicht sicher, wie das mit Frühling integriert, da ich es nicht verwenden. Du könntest es einfach versuchen.

9

Die Validierung auf Methodenebene wird in der kommenden Version 4.2 der Referenzimplementierung Hibernate Validator von JSR 303 unterstützt.

Wie bereits in der vorherigen Antwort erwähnt, können Constraint-Annotationen (sowohl eingebaute als auch benutzerdefinierte Typen) bei Methodenparametern und Rückgabewerten zur Angabe von Vor- und Nachbedingungen für den Aufruf einer Methode angegeben werden.

Beachten Sie, dass sich HV nur mit der eigentlichen Validierung von Methodenaufrufen befasst, nicht jedoch mit einer solchen Validierung. Der Validierungsaufruf könnte unter Verwendung von AOP oder anderer Abfangeinrichtungen für Methoden wie den dynamischen Proxies von JDK erfolgen.

Das JIRA-Problem dafür ist HV-347 [1], also sollten Sie sich als Watcher zu diesem Problem hinzufügen.

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

+0

ich denke, Ihre Blog-Post ergänzt Ihre Antwort;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

Gunnar war nett genug, um seine Lösung in [GitHub] (https://github.com/gunnarmorling/methodvalidation-integration) zu setzen. Hat super für mich gearbeitet. – Patrick

0

können Sie verwenden jcabi-aspects (Ich bin ein Entwickler), die JSR 303 mit AspectJ integriert. Die tatsächliche Validierung erfolgt durch eine der JSR 303-Implementierungen, die Sie zum Klassenpfad hinzufügen müssen, wie Hibernate Validator oder Apache BVal.

2

Im Frühling 3.1.0 können Sie mit @Validated Annotation die Validierung eines Pojos aktivieren. Erstellen Sie eine Schnittstelle für die Pojo-Klasse und fügen Sie diese Anmerkung hinzu. Fügen Sie dann Ihre Validierungsannotationen in die Methodendefinitionen ein.(Die Schnittstelle ist erforderlich, weil Frühling wird eine Proxy-Klasse mit der Schnittstelle als Definition erstellen)

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

Ihre pojo:

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

Ausgehend von einer Standard-Feder Web-Anwendung mit aktiver Validierung, erinnert in hinzufügen Ihre Federkonfiguration diese Bohne Erklärung:

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

Aus irgendeinem seltsamen Grund ConstraintViolationException public \ @NotNull String doSomething(); hat nicht funktioniert, aber \ @NotNull public String doSomething(); hat getan. Verwendete die Leiste, um dem At-Symbol zu entkommen, das von S.O. mit dem Benutzer verwechselt wurde – borjab