Różnica między JAX-RS a Spring Rest

151

Pomyliłem się z różnicą między JAX-RS (cóż, może powinienem użyć Jersey do porównania, ponieważ JAX-RS to tylko specyfikacja) i Spring for Restful services . Próbowałem poszukać więcej informacji w Internecie i stało się to bardziej zagmatwane. Moja firma używa Spring MVC do tworzenia Restful API

Mylące jest to, że JAX-RS oznacza Java API dla RESTful Web Services , wiosną używam javy również do tworzenia RESTful Web Services, więc tak naprawdę nie rozumiem różnic. Czy Spring jest zgodny ze specyfikacjami JAX-RS?

Z tego, co wiem do tej pory:

  1. JAX-RS jest planem / specyfikacją, ma Jersey, RESTeasy itp. Jako implementacje.
Hades
źródło
@ CássioMazzochiMolin dziękuję za odpowiedź, przyjmuję ją za chwilę więcej, jeszcze jedno pytanie, wspomniałeś, że Spring Framework nie jest implementacją JAX-RS, za którą specyfikację podąża Spring? Dzięki
hades
3
Nie implementuje żadnej konkretnej specyfikacji. To po prostu wiosenny sposób robienia rzeczy. Możliwości REST są dostarczane przez spring-webmvcmoduł, który zapewnia również kontroler widoku modelu Springa.
kasiomolina

Odpowiedzi:

160

JAX-RS

JAX-RS to specyfikacja implementacji usług sieciowych REST w Javie, obecnie zdefiniowana przez JSR-370 . Jest częścią technologii Java EE , obecnie definiowanych przez JSR 366 .

Jersey (dostarczany z GlassFish i Payara) jest implementacją referencyjną JAX-RS, jednak istnieją inne implementacje, takie jak RESTEasy (dostarczane z JBoss EAP i WildFly) i Apache CXF (dostarczane z TomEE i WebSphere).

Spring Framework

Spring Framework jest pełne ramy , które pozwala na tworzenie aplikacji biznesowych Java. Możliwości REST są dostarczane przez moduł Spring MVC (ten sam moduł, który zapewnia możliwości kontrolera widoku modelu ). Nie jest to implementacja JAX-RS i może być postrzegana jako wiosenna alternatywa dla standardu JAX-RS.

Ekosystem Spring zapewnia również szeroką gamę projektów do tworzenia aplikacji korporacyjnych, obejmujących trwałość, bezpieczeństwo, integrację z sieciami społecznościowymi, przetwarzanie wsadowe itp.

Przykłady

Rozważ następujący kontroler zasobów korzystający z interfejsu API JAX-RS:

@Path("/greetings")
public class JaxRsController {

    @GET
    @Path("/{name}")
    @Produces(MediaType.TEXT_PLAIN)
    public Response greeting(@PathParam("name") String name) {

        String greeting = "Hello " + name;
        return Response.ok(greeting).build();
    }
}

Równoważna implementacja wykorzystująca Spring MVC API wyglądałaby tak:

@RestController
@RequestMapping("/greetings")
public class SpringRestController {

    @RequestMapping(method = RequestMethod.GET,
                    value = "/{name}", 
                    produces = MediaType.TEXT_PLAIN_VALUE)
    public ResponseEntity<?> greeting(@PathVariable String name) {

        String greeting = "Hello " + name;
        return new ResponseEntity<>(greeting, HttpStatus.OK);
    }
}

Używanie Spring Boot i Jersey

Spring Boot udostępnia spring-boot-starter-jerseymoduł umożliwiający wykorzystanie modelu programowania JAX-RS dla punktów końcowych REST zamiast Spring MVC. Działa całkiem dobrze z Jersey 2.x.

Pełny przykład tworzenia aplikacji internetowej za pomocą Jersey 2.x i Spring Boot 1.4.x znajduje się w tej odpowiedzi .

kasiomolina
źródło
Więc jeśli używamy sprężynowego MVC i depoy go w GlassFish / Payara, czy musimy wyłączać implementacje jax-rs na serwerze?
Pradeep_Evol
czy ten artykuł jest prawdziwy na wiosnę 4 dzone.com/articles/… ? że wiosenna sieć jest lepsza do tworzenia serwisów internetowych resT niż tylko wiosna + Jersey (JAX-RS)?
tgkprog
63

Różnice w adnotacjach

(Stan na 2018 r.) Spring MVC nie ustandaryzował adnotacji JAX-RS, ponieważ jego rozwiązanie jest starsze niż JAX-RS. Oto odpowiedniki:

wprowadź opis obrazu tutaj

https://stormpath.com/blog/jax-rs-vs-spring-rest-endpoints

Jeśli używasz niestandardowych interfejsów API, powinieneś spodziewać się, że zostaną one wycofane i prawdopodobnie zastąpione przez nowszy eksperymentalny interfejs API za kilka lat. Jest dużo mniej odpowiedzialności za wsteczną kompatybilność (np. Gdy zostaną wydane nowe wersje JDK).

Sridhar Sarnobat
źródło
28

Pracowałem zarówno z Jersey Rest, Spring Rest i Jersey Rest with Spring. Oba to bardzo bogate frameworki z ładnymi implementacjami. Sugerowałbym, że lepiej jest wybrać Spring rest, jeśli używasz innych usług Spring, takich jak ORM, Spring Security i DI itp. Obie są bibliotekami Spring, więc czuję się trochę łatwy do zarządzania kodem i zależnościami

Zalety JAX-RS:

  • Standard JSR można uruchomić bez kontenera serwletów (grizzly, simple, ...)
  • Wdrożenia gotowe do produkcji (jersey, cxf, resteasy, restlet, ...) przeznaczone wyłącznie do aplikacji REST

Zalety Spring MVC:

  • Zapewnij „pełny” stos, a nie tylko usługi REST

  • Wstrzykiwanie zależności / AOP / Transakcje

  • Wtykowe szablony widoków (JSP, freemarker, prędkość, ...)

Możesz sprawdzić więcej pod poniższymi linkami

  1. https://www.infoq.com/articles/springmvc_jsx-rs
  2. Dlaczego warto korzystać z JAX-RS / Jersey?
Midhun Pottammal
źródło
4
Jednak JAX-RS może być również używany ze sprężyną (dla DI, AOP, ...).
demon,
6

JAX-RS to specyfikacja, a koszulka itp. To jej implementacja. Ludzie używają Springa do tworzenia usług internetowych RestFul, ponieważ wiosna wraz z spokojną implementacją zapewnia takie rzeczy, jak integracja z hibernacją, a także takie rzeczy jak programowanie zorientowane na IOC i Aspect.

Tam, gdzie tak jakbyśmy użyli jersey do naszej implementacji, problem będzie polegał na tym, że dane muszą zostać pobrane z zaplecza przy użyciu niektórych technologii ORM i będziemy musieli napisać standardowy kod dla tego samego.

To jest powód, dla którego ludzie, a nawet przedsiębiorstwa używają wiosny, ponieważ wraz z wdrożeniem Rest zapewnia ona również udogodnienia Spring. A teraz, korzystając z najnowszej implementacji Spring Boot, możemy bardzo szybko rozpocząć programowanie bez wielu konfiguracji.

Rahul Singh
źródło