2016-05-13 3 views
0

Я разработал веб-сервис на основе SOAP, используя Apache CXF 3 и Spring 3 и развернутый на Tomee. У меня есть 2 xml (1. beans.xml (cxf service) 2. spring-servlt.xml). Я обращаюсь к некоторым компонентам слоя DAO в моем xx-сервисе xx. он не вводится. когда я анализировал класс CXFServlet. Метод loadBus получает контекст приложения из класса WebApplicationContextUtils.Весна фасоли Apache CXF не вводится

Работала нормально в Причале. но он не работает в Томеифе. если я загружаю cxf bean, используя ContextLoaderListener, веб-службы не были обнаружены. после этого я использовал конфигурацию. для причала я не использовал отдельный xml для cxf. Я слился CxF бобы в моем приложении боба, он был загружен диспетчером сервлета и работал хорошо

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; 
    } 

если (CTX! = NULL) { ctx2.setParent (CTX);

поскольку ctx (wac) является null cxf не может установить родительский контекст. Бин инъекции не работает. пожалуйста, сообщите мне, почему этот wac является нулевым.

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> 

Я попробовал все большинство все варианты уже были представлены в форме. Нужно ли добавлять какие-либо параметры в Tomee или в мой код.

+0

Вы добавляете ContextLoaderListener в web.xml – andy

+0

, если я загружаю cxf bean с помощью ContextLoaderListener, веб-службы не были открыты. после этого я использовал конфигурацию. он отлично работал в Jetty. но он не работает в Томее. – Gnana

ответ

0

TomEE - это полноценный Java-сервер Java. Если вы развертываете приложение на основе Spring, вам, скорее всего, не нужно необходимо включить CDI с beans.xml.

Если вы абсолютно уверены, что вам нужно как CDI и Spring включена, я предложил сделать две вещи, чтобы решить эту проблему: Один использовать отладчик, чтобы выяснить, если боб, который не получает инъекции является весна или CDI. Во-вторых, включите подробное ведение журнала Spring, чтобы узнать, что там вводит.

Удачи вам!

Смежные вопросы