2016-05-13 16 views
0

Ich habe SOAP-basierten Web-Service mit Apache CXF 3 und Spring 3 entwickelt und auf Tomee bereitgestellt. Ich habe 2 xml (1. bohnen.xml (cxf service) 2. spring-servlt.xml). Ich verweise einige DAO-Layer-Beans in meinem CXF-Service-XML. es wird nicht injiziert. als ich die CXFServlet-Klasse analysiert habe. loadBus-Methode ruft Anwendungskontext von der WebApplicationContextUtils-Klasse ab.Apache CXF Spring Bean ist nicht injiziert

es funktionierte gut in Jetty. aber es funktioniert nicht in Tomeeif. Wenn ich cxf-Bean mit ContextLoaderListener lade, wurden Web-Services nicht verfügbar gemacht. Danach habe ich den Config-Location benutzt. für Jetty habe ich kein separates Xml für CXF verwendet. Ich fusionierte cxf Bohnen in meiner Anwendung Bohne, es wurde vom Dispatcher Servlet geladen und arbeitet gut

CXFServlet.java

protected void loadBus(ServletConfig sc) { 
    ApplicationContext wac = WebApplicationContextUtils. 
     getWebApplicationContext(sc.getServletContext()); 

private ApplicationContext createSpringContext(ApplicationContext ctx, 
                ServletConfig servletConfig, 
                String location) { 
     XmlWebApplicationContext ctx2 = new XmlWebApplicationContext(); 
     createdContext = ctx2; 

     ctx2.setServletConfig(servletConfig); 
     Resource r = ctx2.getResource(location); 
     try { 
      InputStream in = r.getInputStream(); 
      in.close(); 
     } catch (IOException e) { 
      //ignore 
      r = ctx2.getResource("classpath:" + location); 
      try { 
       r.getInputStream().close(); 
      } catch (IOException e2) { 
       //ignore 
       r = null; 
      } 
     } 
     try { 
      if (r != null) { 
       location = r.getURL().toExternalForm(); 
      } 
     } catch (IOException e) { 
      //ignore 
     }   
     if (ctx != null) { 
      ctx2.setParent(ctx); 
      String names[] = ctx.getBeanNamesForType(Bus.class); 
      if (names == null || names.length == 0) { 
       ctx2.setConfigLocations(new String[] {"classpath:/META-INF/cxf/cxf.xml", 
                 location});     
      } else { 
       ctx2.setConfigLocations(new String[] {location});         
      } 
     } else { 
      ctx2.setConfigLocations(new String[] {"classpath:/META-INF/cxf/cxf.xml", 
                location}); 
      createdContext = ctx2; 
     } 
     ctx2.refresh(); 
     return ctx2; 
    } 

if (CTX! = Null) { ctx2.setParent (CTX);

seit ctx (wac) ist null cxf ist nicht in der Lage, übergeordnete Kontext zu setzen. Bean inject funktioniert nicht. Bitte führe mich, warum dieser Wac null ist.

Web.xml

<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>/connector/*</url-pattern> 
</servlet-mapping> 


<servlet> 
    <servlet-name>CXFServlet</servlet-name> 
    <display-name>CXF Servlet</display-name> 
    <servlet-class> 
     org.apache.cxf.transport.servlet.CXFServlet 
    </servlet-class> 
    <init-param> 
     <param-name>config-location</param-name> 
     <param-value>/WEB-INF/beans.xml</param-value>  
    </init-param> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>CXFServlet</servlet-name> 
    <url-pattern>/services/*</url-pattern> 
    </servlet-mapping> 

habe ich versucht, alle die meisten alle Optionen wurden bereits in Form zur Verfügung gestellt. Muss ich einen Parameter in Tomee oder in meinem Code hinzufügen.

+0

haben Sie ContextLoaderListener zu web.xml – andy

+0

hinzufügen, wenn ich CXF-Bean mit ContextLoaderListener laden, Web-Services wurden nicht offengelegt. Danach habe ich den Config-Location benutzt. Es funktionierte gut in Jetty. aber es funktioniert nicht in Tomee. – Gnana

Antwort

0

TomEE ist ein Full-Stack-Java EE-Server. Wenn Sie eine Spring-basierte Anwendung bereitstellen, müssen Sie wahrscheinlich nicht müssen CDI mit beans.xml aktivieren.

Wenn Sie absolut positiv sind Sie beide CDI und Spring aktiviert, schlug ich vor, Sie zwei Dinge zu tun, um das Problem zu lösen: Verwenden Sie einen Debugger, um herauszufinden, ob die Bohne, die nicht injiziert wird ein Spring ist oder CDI-Bean. Zweitens, aktivieren Sie die ausführliche Spring-Protokollierung, um zu sehen, was dort eingespeist wird.

Viel Glück!