Apache CXF spring bean未注入

时间:2016-05-13 23:39:52

标签: java spring cxf tomee

我使用Apache CXF 3和Spring 3开发了基于SOAP的Web服务,并部署在Tomee上。我有2个xml(1. beans.xml(cxf服务)2。spring-servlt.xml)。我在我的cxf服务xml中引用了一些DAO图层bean。它没有被注射。当我在CXFServlet类上进行分析时。 loadBus方法从WebApplicationContextUtils类获取应用程序上下文。

它在Jetty工作正常。但它在Tomeeif没有用。如果我使用ContextLoaderListener加载cxf bean,则不会公开Web服务。之后我使用了config-location。对于码头我没有使用单独的xml用于cxf。我在我的应用程序bean中合并了cxf bean,它由调度程序servlet加载并且运行良好

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

因为ctx(wac)为null,所以cxf无法设置父上下文。 bean inject无法正常工作。请指导我为什么这个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或我的代码中添加任何参数。

1 个答案:

答案 0 :(得分:0)

TomEE是一个完整的堆栈Java EE服务器。如果您正在部署基于Spring的应用程序,您可能不需要使用beans.xml启用CDI。

如果你绝对正面你需要同时启用CDI和Spring,我建议你做两件事来解决这个问题:一个人使用调试器来判断bean是否没有得到inject是一个Spring或CDI bean。其次,打开详细的Spring记录,看看它注入了什么。

祝你好运!