Jersey 2 and Spring integration with Java customization

I am using Jersey 2.10 and jersey-spring3 and Spring 4. I want to achieve DI (mainly services) in knitwear resources as well as in other places and want to create Spring Beans through Java configuration.

Currently, I cannot find a way to do this. Any idea how to do this?

my web.xml is as follows

<web-app> <display-name>Restful Web Application</display-name> <servlet> <servlet-name>jersey-serlvet</servlet-name> <servlet-class> org.glassfish.jersey.servlet.ServletContainer </servlet-class> <init-param> <param-name> jersey.config.server.provider.packages </param-name> <param-value>com.xyz</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/application-context.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet-mapping> <servlet-name>jersey-serlvet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> 
+7
java spring rest
source share
4 answers

web application:

 <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 a simple controller:

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

for testing:

local: 8080 / [AppName] / HelloController / hello

Remember to exclude old Spring dependencies if you have no conflicts. You can do this the same way as in 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> 
+9
source share

Old fashioned way:

Since you have already initialized ContextLoaderListener simple trick is to use WebApplicationContext to get your bean components anywhere in the application:

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

Jersey Support:

Or you can use annotation-based discovery, as Jersey already supports Spring DI . You must register your beans under your main application entry point. This entry point in the example below will be some.package.MyApplication , to be provided as the <init-param> 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 your 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 see the finished example from the Jersey Git repository.

+2
source share

Here's what I found, starting with various lessons. 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); } } 
+1
source share

For those trying to do this with a Java configuration:

  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
source share

All Articles