Spring 4 vs Jersey dla usług sieciowych REST

117

Planujemy zrobić nową aplikację z wiosenną wersją 4.0.6. Używamy kontrolera, który może zwrócić „XML” lub „JSON”. W poprzednim projekcie z powodzeniem zaimplementowaliśmy Jersey ze wsparciem Spring for REST przy użyciu JAX-RS API, ale po przeczytaniu kilku artykułów i sugestii seniorów stwierdzili, że wiosna zapewnia całkiem niezłe wsparcie REST.

Niektóre z punktów, które naprawdę mnie zmyliły, jeśli używam obsługi Spring REST bez korzystania z JAX-RS i Jersey, to:

  1. Jak zorganizowanie i cofnięcie kaucji zostało wykonane w Spring MVC?

  2. Czy konieczne jest użycie jax-rs.

  3. Jeśli organizowanie i cofanie karetki jest automatycznie obsługiwane wiosną, to skąd wie o xmlRootElements.

Nadal jestem zdezorientowany, jeśli wiosna okazała się bardzo dobrym wsparciem dla REST, to dlaczego ludzie nadal wybierają Jersey na REST? Naprawdę chcę dowiedzieć się więcej szczegółów.

Jeśli powiedziałem coś złego, zignoruj ​​to. Wyjaśnienie z przykładem jest naprawdę pomocne.

Z góry dziękuję!!

Robin Saxena
źródło

Odpowiedzi:

119

Powiedziałbym, że zarówno Jersey, jak i Spring MVC są świetne - każdy projekt ma swój własny styl i mocne strony. W każdym razie Stack Overflow nie jest odpowiednim miejscem do zadawania subiektywnych porównań (twoje pytanie zostałoby dość szybko zamknięte). Jeśli używasz już Sprężyna do wszystkiego i nie są wymagane , aby korzystać z JAX-RS, potem wiosna MVC sprawia, że całkowity sens.

Jeśli chodzi o funkcje takie jak (nie) krosowanie, JAX-RS to w końcu tylko specyfikacja - inne biblioteki mogą oferować podobne funkcje bez implementowania tego samego API.

  1. Zamiast MessageBodyReaders / Writers Spring MVC używa HttpMessageConverters do obsługi (nie) kierowania zasobów REST. Spring MVC obsługuje negocjacje treści i wybiera najlepszy dostępny konwerter do danego zadania (można dodawać adnotacje do metod, aby wskazać, jaki typ mediów generują / konsumują).

  2. Nie, nie jest konieczne używanie JAX-RS do (nie) organizowania zasobów. W rzeczywistości implementacje JAX-RS i Spring MVC używają bibliotek serializacji innych firm do wykonania tego zadania; więc nie jest przywiązany do określonego standardu.

  3. W wersji 4.0.6 Spring obsługuje wiele HttpMessageConverters , w tym Jackson dla JSON, JAXB dla XML i wiele innych. Spring 4.1.0 dodał więcej HttpMessageConverters :

Odpowiadając na ostatnią kwestię, @XmlRootElementjest to adnotacja JAXB i nie jest częścią JAX-RS. Spring obsługuje JAXB .

Aby uzyskać pełniejszy przykład z REST na wiosnę, zapoznaj się z tym przewodnikiem dla początkujących (otrzymasz kompletny przykład działający za 10-15 minut).

Znowu ostatnia część twojego pytania jest dość subiektywna - istnieje wiele popularnych rozwiązań do budowania usług REST w JVM, nie tylko Jersey i Spring (Dropwizard, Play! Framework itp.).

Brian Clozel
źródło
2
Gdzie sugerowałbyś, aby ktoś zadał takie pytanie?
swade
8
„Twoje pytanie zostanie zamknięte dość szybko”! Nie tak szybko :)
Afshin Moazami,
6
Uwielbiam stackoverflow i uwielbiam quorę, nigdy nie podobała mi się ta polityka zamykających subiektywnych pytań i nigdy nie myślałem o zadawaniu pytań technicznych w
quorze
Jedno styczne pytanie: czy możemy mieć Jersey i SpringRest w tym samym EAR, oba działające razem dla różnych zestawów usług?
pramodc84
22

Obsługa AFAIK Spring REST jest oparta na Spring MVC, a nie na implementacji JAX-RS, podczas gdy Jersey zaimplementował specyfikację JAX-RS. Ci, którzy mają Spring (Core, AOP lub MVC) w swoim projekcie, wybierają obsługę Spring ReST zamiast implementatora JAX-RS.

Polecam Jersey jako dojrzały, implementuje JAX-RS i jest łatwy w użyciu.

VGaur
źródło
1
Dzięki za odpowiedź, jak organizowanie i cofanie ostrzału wykonano wiosną bez użycia jax-rs.
Robin Saxena,
tak, zgadzam się z Tobą. Spring Web MVC Rest nie jest tak łatwy w użyciu. Istnieje wiele konfiguracji, o które należy zadbać.
Evan Hu
2
Jersey jest również dobrym wyborem, jeśli używasz (lub chcesz używać) butów wiosennych. cf dokumentacja
herau
1
Możesz użyć biblioteki Google GSON do organizowania i cofania. Obsługuje typy generyczne Java i obiekty niestandardowe.
Tejzeratul