2010-12-12 32 views
10

Czy JSR-303 jest również przeznaczony do sprawdzania parametrów metod?Metoda sprawdzania poprawności parametru za pomocą JSR-303

Jeśli tak, czy jest jakiś przykład w Internecie? Największym wyzwaniem, przed którym stoję, jest uzyskanie walidatora w ramach każdej metody. Z Spring 3, czy to nie znaczy, że musiałbym wstrzyknąć praktycznie każdą klasę z LocalValidatorFactoryBean?

Dzięki!

Odpowiedz

3

To brzmi jak przypadek użycia dla AOP (AspectJ). Napisz punkt dla metod oznaczonych javax.validation.constraints.*, wprowadź walidator do aspektu (prawdopodobnie używając Spring) i użyj porady @Before lub @Around, aby wykonać sprawdzanie poprawności przed wykonaniem metody.

Przeczytaj AspectJ in Action w celach informacyjnych.

3

javadocs dla każdego z JSR 303 adnotacji mówi co następuje:

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

See, PARAMETER ma. Więc tak, to jest możliwe technicznie.

Oto przykład:

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

ja jednak nie jestem pewien, w jaki sposób integruje się z wiosną, ponieważ nie używam go. Możesz po prostu spróbować.

9

Sprawdzanie poziomu metod będzie obsługiwane w nadchodzącej wersji 4.2 implementacji referencyjnej JSR 303 Hibernate Validator.

Jak wskazano w poprzedniej odpowiedzi, umożliwi to określenie adnotacji więzów (zarówno wbudowanych, jak i niestandardowych zdefiniowanych typów) w parametrach metody i wartościach zwracanych w celu określenia warunków wstępnych i końcowych dla wywołania metody.

Należy zauważyć, że HV będzie zajmować się tylko rzeczywistym sprawdzaniem wywołań metod, a nie wyzwaniem takiego sprawdzania poprawności. Wywołanie walidacji może zostać wykonane za pomocą AOP lub innych metod przechwytywania metod, takich jak dynamiczne proxy JDK.

Kwestią JIRA dotyczącą tego problemu jest HV-347 [1], więc warto dodać siebie jako obserwatora do tego problemu.

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

+0

myślę Twój blogu uzupełnia swoją odpowiedź;) http://musingsofaprogrammingaddict.blogspot.com/2011/01/method-validation-with-h ibernate.html – Maxym

+0

Gunnar był na tyle miły, że umieścił swoje rozwiązanie w [GitHub] (https://github.com/gunnarmorling/methodvalidation-integration). Sprawdziło się doskonale dla mnie. – Patrick

0

Można użyć jcabi-aspects (jestem programistą), który integruje JSR 303 z AspectJ. Rzeczywista weryfikacja odbywa się za pomocą jednej z implementacji JSR 303, którą należy dodać do ścieżki klasy, takiej jak Hibernate Validator lub Apache BVal.

2

Wiosną 3.1.0 można użyć adnotacji @Validated do aktywacji sprawdzania poprawności na pojo. Utwórz interfejs dla klasy pojo i umieść na nim tę adnotację, a następnie dodaj adnotacje sprawdzania poprawności w definicjach metod.(Interfejs jest wymagane, ponieważ Wiosna będzie utworzyć klasę proxy przy użyciu interfejsu jako definicji)

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

Twój pojo:

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

począwszy od standardowej aplikacji wiosna internetowej z aktywnym walidacji, należy dodać w konfiguracja wiosna deklaracja ta fasola:

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

Dla niektórych dziwne przyczyny ConstraintViolationException public \ @NotNull String doSomething(); nie działa, ale \ @NotNull public String doSomething(); zrobił. Użyto paska, aby uciec przed symbolem At, który został skonfundowany z użytkownikiem przez S.O – borjab

Powiązane problemy