Integrating Jersey 2 and Spring with Java Based Configuration Integrating Jersey 2 and Spring with Java Based Configuration spring spring

Integrating Jersey 2 and Spring with Java Based Configuration


web-app:

<context-param>    <param-name>contextClass</param-name>    <param-value>      org.springframework.web.context.support.AnnotationConfigWebApplicationContext  </param-value></context-param><context-param>    <param-name>contextConfigLocation</param-name>    <param-value>xxx.xxx.configuration.ApplicationConfiguration</param-value></context-param><listener>    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet>    <servlet-name>SpringApplication</servlet-name>    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    <init-param>        <param-name>jersey.config.server.provider.classnames</param-name>        <param-value>xxx.xxx.controllers.HelloController</param-value>    </init-param>    <load-on-startup>1</load-on-startup></servlet><servlet-mapping>    <servlet-name>SpringApplication</servlet-name>    <url-pattern>/*</url-pattern></servlet-mapping>

JavaBased Configuration:

@Configurationpublic class ApplicationConfiguration {  @Bean  HelloService helloService () {    return new HelloServiceImpl();  }}

and simple controller:

@Component@Path("/helloController")public class HelloController {  @Autowired  @Qualifier("helloService")  private HelloService helloService ;   @GET   @Path("/hello")   public String hello() {    helloService.service();  }}

for testing:

localhost:8080/[AppName]/helloController/hello

remember about excluding old Spring dependencies you may have some conflicts if you don't. You can do this same as on the example below or through DependencyManagement.

<dependencies>    <!-- Jersey -->    <dependency>        <groupId>org.glassfish.jersey.ext</groupId>        <artifactId>jersey-spring3</artifactId>        <version>2.11</version>        <exclusions>            <exclusion>                <artifactId>spring-context</artifactId>                <groupId>org.springframework</groupId>            </exclusion>            <exclusion>                <artifactId>spring-beans</artifactId>                <groupId>org.springframework</groupId>            </exclusion>            <exclusion>                <artifactId>spring-core</artifactId>                <groupId>org.springframework</groupId>            </exclusion>            <exclusion>                <artifactId>spring-web</artifactId>                <groupId>org.springframework</groupId>            </exclusion>            <exclusion>                <artifactId>jersey-server</artifactId>                <groupId>org.glassfish.jersey.core</groupId>            </exclusion>            <exclusion>                <artifactId>                    jersey-container-servlet-core                </artifactId>                <groupId>org.glassfish.jersey.containers</groupId>            </exclusion>            <exclusion>                <artifactId>hk2</artifactId>                <groupId>org.glassfish.hk2</groupId>            </exclusion>        </exclusions>    </dependency>    <!-- Spring 4 dependencies -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-core</artifactId>        <version>4.0.6.RELEASE</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-context</artifactId>        <version>4.0.6.RELEASE</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-beans</artifactId>        <version>4.0.6.RELEASE</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>        <version>4.0.6.RELEASE</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-aspects</artifactId>        <version>4.0.6.RELEASE</version>    </dependency></dependencies>


Old Fashioned way:

Since you have already initialized the ContextLoaderListener a simple trick is to use the WebApplicationContext to retrieve your beans at any application point:

WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);SomeBean someBean = (SomeBean) ctx.getBean("someBean");

Jersey Support:

Or you can use the annotation based discovery, since Jersey has already support for Spring DI. You have to register your beans under your main application entry point. That entry point, in below example will be some.package.MyApplication, should be provided as an <init-param> of the servlet container:

<servlet>  <servlet-name>SpringApplication</servlet-name>  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>  <init-param>    <param-name>javax.ws.rs.Application</param-name>    <param-value>some.package.MyApplication</param-value>  </init-param>  <load-on-startup>1</load-on-startup></servlet>

Register you beans in your application:

package some.package;import org.glassfish.jersey.server.ResourceConfig;import org.glassfish.jersey.server.spring.scope.RequestContextFilter;public class MyApplication extends ResourceConfig {  public MyApplication () {    register(RequestContextFilter.class);    register(SomeBean.class);    // ...  }}

Here you can take a look to a ready to run example from Jersey Git repo.


Here is something that I found starting from various tutorials. Combined with other answers you should have a complete example.

import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.ServletRegistration;import com.sun.jersey.spi.spring.container.servlet.SpringServlet;import org.springframework.web.WebApplicationInitializer;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;public class WebInitializer implements WebApplicationInitializer {    @Override    public void onStartup(ServletContext servletContext) throws ServletException {        AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();        ctx.register(AppConfig.class);        ctx.setServletContext(servletContext);        servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ctx);        ServletRegistration.Dynamic servlet = servletContext.addServlet("jersey-serlvet", new SpringServlet());        servlet.addMapping("/");        servlet.setLoadOnStartup(1);    }}