Search code examples
spring-mvcjerseyjax-rs

Difference between JAX-RS and Spring Rest


I confused with the difference between JAX-RS (well, maybe should use Jersey to do comparison since JAX-RS is just spec) and Spring for Restful services. I tried to search for more information online and it become more confusing. My company is using Spring MVC to develop Restful APIs

The confusing part is, JAX-RS stands for Java API for RESTful Web Services, in Spring i am also using java to develop RESTful Web Services, so i don't actually get the differences. Does Spring follow the JAX-RS specifications?

From what i know until now:

  1. JAX-RS is a blueprint/specification, it has Jersey, RESTeasy, etc as implementations.

Solution

  • 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.