我使用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或我的代码中添加任何参数。
答案 0 :(得分:0)
TomEE是一个完整的堆栈Java EE服务器。如果您正在部署基于Spring的应用程序,您可能不需要使用beans.xml启用CDI。
如果你绝对正面你需要同时启用CDI和Spring,我建议你做两件事来解决这个问题:一个人使用调试器来判断bean是否没有得到inject是一个Spring或CDI bean。其次,打开详细的Spring记录,看看它注入了什么。
祝你好运!