Difference between JAX-RS and Spring Rest
I worked with both Jersey Rest, spring rest and Jersey Rest with spring. Both of them are very rich frameworks with nice implementations. I would suggest it's better to go with Spring rest if you are using other Spring services such as ORM ,Spring security and DI etc. Both are spring libraries, so I feel a little bit easy for managing code and dependencies
JAX-RS pros:
- JSR standard can be run without servlet container (grizzly, simple, ...)
- Production-ready implementations (jersey, cxf, resteasy, restlet, ...) designed for REST applications only
Spring MVC pros:
Provide "full" stack, not just REST facilities
Dependency injection / AOP / Transactions
Pluggable view templates (JSP, freemarker, velocity, ...)
You can check more on the following links
- https://www.infoq.com/articles/springmvc_jsx-rs
- Why use JAX-RS / Jersey?
Annotation differences
(As of 2018) Spring MVC has not standardized to JAX-RS annotations, since its solution predates JAX-RS. Here are the equivalents:
https://stormpath.com/blog/jax-rs-vs-spring-rest-endpoints
If you are using non-standardized APIs you should expect them to be deprecated and possibly superseded by a newer experimental API in a few years. There is a lot less accountability to backward compatibility (eg when a new JDK versions get released).
JAX-RS
JAX-RS is a specification for implementing REST web services in Java, currently defined by the JSR-370. It is part of the Java EE technologies, currently defined by the JSR 366.
Jersey (shipped with GlassFish and Payara) is the JAX-RS reference implementation, however there are other implementations such as RESTEasy (shipped with JBoss EAP and WildFly) and Apache CXF (shipped with TomEE and WebSphere).
Spring Framework
The Spring Framework is a full framework that allows you to create Java enterprise applications. The REST capabilities are provided by the Spring MVC module (same module that provides model-view-controller capabilities). It is not a JAX-RS implementation and can be seen as a Spring alternative to the JAX-RS standard.
The Spring ecosystem also provides a wide range of projects for creating enterprise applications, covering persistence, security, integration with social networks, batch processing, etc.
Examples
Consider the following resource controller using the JAX-RS API:
@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();
}
}
The equivalent implementation using the Spring MVC API would be:
@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);
}
}
Using Spring Boot and Jersey
Spring Boot provides the spring-boot-starter-jersey
module that allows you to use the JAX-RS programming model for the REST endpoints instead of Spring MVC. It works quite well with Jersey 2.x.
For a complete example of creating a web application with Jersey 2.x and Spring Boot 1.4.x, refer to this answer.