package org.apache.cxf.transport.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.core.io.Resource;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;
public class CXFServlet extends CXFNonSpringServlet
{
protected void loadBus(ServletConfig sc)
{ //获取servlet信息
ApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(sc.getServletContext());
//默认找web.xml配置文件中的"config-location"
//<!-- 配置CXF的核心Servlet -->
//<servlet>
// <servlet-name>cxf</servlet-name>
// <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
// <!-- 通过初始化参数指定cxf配置文件的位置 -->
// <!-- 以下不注释则调用服务时会重新加载 -->
// <!--
// <init-param>
// <param-name>config-location</param-name>
// <param-value>classpath:cxf-servlet.xml</param-value>
// </init-param>
// -->
//</servlet>
String configLocation = sc.getInitParameter("config-location");
if (configLocation == null)
try {
//当找不到默认的"config-location"时,去找cxf-servlet.xml文件
InputStream is = sc.getServletContext().getResourceAsStream("/WEB-INF/cxf-servlet.xml");
if ((is != null) && (is.available() > 0)) {
is.close();
configLocation = "/WEB-INF/cxf-servlet.xml";
}
}
catch (Exception ex)
{
}
if (configLocation != null) {
wac = createSpringContext(wac, sc, configLocation);
}
if (wac != null)
setBus((Bus)wac.getBean("cxf", Bus.class));
else
setBus(BusFactory.newInstance().createBus());
}
private ApplicationContext createSpringContext(ApplicationContext ctx, ServletConfig sc, String location)
{
XmlWebApplicationContext ctx2 = new XmlWebApplicationContext();
ctx2.setServletConfig(sc);
Resource r = ctx2.getResource(location);
try {
InputStream in = r.getInputStream();
in.close();
}
catch (IOException e) {
r = ctx2.getResource("classpath:" + location);
try {
r.getInputStream().close();
}
catch (IOException e2) {
r = null;
}
}
try {
if (r != null)
location = r.getURL().toExternalForm();
}
catch (IOException e)
{
}
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 });
}
ctx2.refresh();
return ctx2;
}
}