2016-08-31 1 views
1

Um zu lernen (Spring Boot ist großartig und magisch ..), versuche ich eine Web-App mit Jersey einrichten und Frühling (für DI). Ich habe es geschafft, aber es funktioniert nur mit Spring Xml-Konfiguration.Wie man Jersey 2/Spring 4 lädt Beans von @Configuration auf einer no web.xml Konfiguration

I erweitert ResourceConfig

@ApplicationPath("/api") 
public class JerseyWebApp extends ResourceConfig { 

    public JerseyWebApp() { 
     packages("com.company.controller"); 
    } 
} 

Mein HelloController.java

@Path("/hello") 
public class HelloController { 

    private HelloService helloService; 

    @Autowired 
    public HelloController(HelloService helloService) { 
     this.helloService = helloService; 
    } 

    @GET 
    public String hello() { 
     return helloService.sayHello(); 
    } 
} 

mein HelloService.java

@Component 
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE) 
public class HelloService { 

    public String sayHello() { 
    return "hello from jersey webapp"; 
    } 
} 

und meine Feder applicationContext.xml

Anbringen Auch meine pom-Datei

<properties> 
    <jersey2.version>2.23.2</jersey2.version> 
    <jaxrs.version>2.0.1</jaxrs.version> 
    <spring.version>4.3.2.RELEASE</spring.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet</artifactId> 
     <version>${jersey2.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.ext</groupId> 
     <artifactId>jersey-spring3</artifactId> 
     <version>${jersey2.version}</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--> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-beans</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
    </dependency> 
</dependencies> 

Ist es möglich, Jersey zu bekommen Bohnen über eine @Configuration Klasse laden oder soll ich prüfen, mit Spring Web/mvc die gesamte Anwendung Bootstrap.

Antwort

2

Die Bibliothek jersey-spring3 für „irgendeinen Grund“ in der Datei ist org.glassfish.jersey.server.spring.SpringWebApplicationInitializer.java standardmäßig für eine Classpath Ressource suchen:

sc.setInitParameter("contextConfigLocation", "classpath:applicationContext.xml"); 

und Java-basierte Federkonfigurationen nicht unterstützt. Es ist ein bekanntes ungelöstes Problem gefunden here.

Um Java-basierte Annotationskonfigurationen mit Spring DI zu registrieren, musste ich es umgehen und meine Webanwendung mithilfe einer benutzerdefinierten Implementierung von ServletContainerInitializer booten.

JerseyServletContainerInitializer.java

public class JerseyServletContainerInitializer implements ServletContainerInitializer { 

    @Override 
    public void onStartup(Set<Class<?>> classes, ServletContext servletContext) throws ServletException { 

    //Register spring configurations 
    AnnotationConfigWebApplicationContext springContext = new AnnotationConfigWebApplicationContext(); 
    springContext.register(SpringConfig.class, JPAConfig.class); 
    servletContext.addListener(new RequestContextListener()); 
    servletContext.addListener(new ContextLoaderListener(springContext)); 
    springContext.setServletContext(servletContext); 

    //Register Jersey servlet 
    ServletRegistration.Dynamic servletRegistration = servletContext.addServlet("JerseyServlet", new ServletContainer()); 
    servletRegistration.addMapping("/api/*"); 
    servletRegistration.setLoadOnStartup(1); 
    servletRegistration.setInitParameter("javax.ws.rs.Application", JerseyResourceConfig.class.getName()); 
    } 
} 

JerseyResourceConfig.java

public class JerseyResourceConfig extends ResourceConfig { 

    public JerseyResourceConfig() { 
    packages("com.company.controller"); 
    } 
} 
+0

Sehr schöne Arbeit um: Hier ist meins: https://github.com/bric3/jersey2-spring4-example – Brice

Verwandte Themen