27.2 JAX-RS and Jersey
If you prefer the JAX-RS programming model for REST endpoints you can use one of the available implementations instead of Spring MVC. Jersey 1.x and Apache CXF work quite well out of the box if you just register their Servlet
or Filter
as a @Bean
in your application context. Jersey 2.x has some native Spring support so we also provide auto-configuration support for it in Spring Boot together with a starter.
To get started with Jersey 2.x just include the spring-boot-starter-jersey
as a dependency and then you need one @Bean
of type ResourceConfig
in which you register all the endpoints:
_@Component_ public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(Endpoint.class); } }
You can also register an arbitrary number of beans implementing ResourceConfigCustomizer
for more advanced customizations.
All the registered endpoints should be @Components
with HTTP resource annotations (@GET
etc.), e.g.
_@Component_ _@Path("/hello")_ public class Endpoint { _@GET_ public String message() { return "Hello"; } }
Since the Endpoint
is a Spring @Component
its lifecycle is managed by Spring and you can @Autowired
dependencies and inject external configuration with @Value
. The Jersey servlet will be registered and mapped to /*
by default. You can change the mapping by adding @ApplicationPath
to your ResourceConfig
.
By default Jersey will be set up as a Servlet in a @Bean
of type ServletRegistrationBean
named jerseyServletRegistration
. By default, the servlet will be initialized lazily but you can customize it with spring.jersey.servlet.load-on-startup
.You can disable or override that bean by creating one of your own with the same name. You can also use a Filter instead of a Servlet by setting spring.jersey.type=filter
(in which case the @Bean
to replace or override is jerseyFilterRegistration
). The servlet has an @Order
which you can set with spring.jersey.filter.order
. Both the Servlet and the Filter registrations can be given init parameters using spring.jersey.init.*
to specify a map of properties.
There is a Jersey sample so you can see how to set things up. There is also a Jersey 1.x sample. Note that in the Jersey 1.x sample that the spring-boot maven plugin has been configured to unpack some Jersey jars so they can be scanned by the JAX-RS implementation (because the sample asks for them to be scanned in its Filter
registration). You may need to do the same if any of your JAX-RS resources are packaged as nested jars.