Integrating Jersey 2 and Spring with Java Based Configuration

后端 未结 4 604
日久生厌
日久生厌 2020-12-30 12:18

I am using Jersey 2.10 and jersey-spring3 and Spring 4. I want to achieve DI(basically services) in jersey resources as well as in other places and want to create Spring Bea

相关标签:
4条回答
  • 2020-12-30 12:48

    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.

    0 讨论(0)
  • 2020-12-30 12:48

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-30 13:00

    For those trying to do it with Java config:

        public static void main(String[] args) throws IOException {
            HttpServer server = new HttpServer();
            NetworkListener listener = new NetworkListener("grizzly2", "localhost", 2088);
            server.addListener(listener);
    
            WebappContext ctx = new WebappContext("ctx","/");
            final ServletRegistration reg = ctx.addServlet("spring", new SpringServlet());
            reg.addMapping("/*");
            ctx.addContextInitParameter( "contextClass", "org.springframework.web.context.support.AnnotationConfigWebApplicationContext" );
            ctx.addContextInitParameter( "contextConfigLocation", "com.example.AppConfig" );
            ctx.addListener( "org.springframework.web.context.ContextLoaderListener" );
            ctx.addListener("org.springframework.web.context.request.RequestContextListener");
    
            ctx.deploy(server);
    
            server.start();
    
            System.in.read();
    
    }
    
    0 讨论(0)
  • 2020-12-30 13:01

    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:

    @Configuration
    public 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>
    
    0 讨论(0)
提交回复
热议问题