2012-02-28 9 views
5

Czy możliwe jest skuteczne wykorzystanie adnotacji JSR303 (Bean Validation) na zasobach JAX-RS?Sprawdzanie poprawności zasobów JAX-RS (Apache Wink) za pomocą JSR303?

Na przykład, jeśli posiadam członka zasobu, którego przypisałem @NotEmpty, wygeneruję błąd z powrotem do klienta, jeśli to ograniczenie nie jest spełnione?

To wydaje się oczywiste rzeczy do zrobienia, ale również chętnie powiedzą lepszych sposobów (nie chcę, aby przejść walidację w dół do poziomu ORM/bazy danych)

Odpowiedz

3

Czy naprawdę myśli sprawdzania zasobów członkowie? Zwykle członkowie zasobów są wstrzykiwani w ten lub inny sposób (to albo konteksty, encje, albo parametry ścieżki/zapytania/macierzy), o ile struktura JAX-RS działa, a otrzymasz te elementy prawidłowo wstrzyknięte.

Osobiście uważam, że bardziej sensowne jest walidowanie istoty, odkąd przybył przez przewód, wypełniony przez MessageBodyReader i zasadniczo nie masz pojęcia, co jest w środku, prawda?

Więc jeśli zdecydujesz się potwierdzić podmioty, istnieje kilka sposobów, które można podjąć:

  1. AFAIK, Apache Wink nie obsługuje wbudowanych walidacji. Możesz zaimplementować moduł obsługi. Zobacz DeploymentConfiguration.initRequestHandlersChain(). Obsługuje dodawanie programów obsługi użytkownika. W twoim treserze możesz wykonać wszelkie walidacje. Myślę nawet, że społeczność Wink będzie zadowolona, ​​jeśli wesprzesz ten kod.
    Jedyny problem z tym podejściem - jest związany z interfejsem Apache Wink. Nie zadziała, jeśli zdecydujesz się na przejście do innej struktury JAX-RS.

  2. Innym podejściem jest dokonanie tej walidacji we własnym MessageBodyReader. Wszystko, co musisz zrobić, to zarejestrować specjalny czytnik dla swoich jednostek i potwierdzić istnienie w środku. Nadal możesz korzystać ze standardowych funkcji MessageBodyReaders (takich jak JAXB lub Jackson), używając @Context Providers.getMessageBodyReader(). Dobrą częścią tego podejścia jest to, że jest to standard JAX-RS. Złe, że używasz MessageBodyReaders do czegoś, do czego nie były przeznaczone.

  3. Najprostszym sposobem jest sprawdzenie jednostki w pierwszym wierszu każdej metody zasobów. Stworzy to trochę powielania kodu, ale czasami wygrywa prostota.

1

Jedno rozwiązanie - ponieważ używam Spring 2.5.x, mogę utworzyć klasę opakowania, która implementuje InitializingBean i deleguje do walidatora Hibernate. Działa - czy istnieje lepsze rozwiązanie?

+0

Aktualizacja - myślę, że odpowiada to odpowiedzi @ Tarlog # 3. – Brabster

+0

Właściwie pomyślałem, żeby umieścić go na 4 pozycji, ale potem zdecydowałem się go opuścić. Problem z tym podejściem, że klasa opakowania może nie mieć adnotacji z klasy zasobów. To naprawdę zależy od sposobu wdrożenia. – Tarlog

Powiązane problemy