项目运用spring mvc 框架搭建,后期需要用到webservice,于是使用cxf整合。
web.xml配置代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.gif</url-pattern>
<url-pattern>*.png</url-pattern>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.html</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>CXFWebService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml,/WEB-INF/spring-servlet.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFWebService</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
</web-app>
applicationContext.xml配置代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<!--导入与CXF框架有关的xml-->
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- webservice配置 -->
<bean id="photoService" class="com.pms.ws.impl.PhotoServiceImpl"></bean>
<jaxws:endpoint id="photoWS" implementor="#photoService" address="/photo"></jaxws:endpoint>
//余下配置省略……………………
</beans>
接口与实现类都已经写清且无误,但我访问:localhost:8080/项目名/ws/photo?wsdl 时页面则显示:No service was found.
网上查了下有人说:Spring MVC是通过DispatcherServlet来加载Spring配置文件的,因此不需要在web.xml中配置ContextLoaderListener。但是CXF却需要通过ContextLoaderListener来加载Spring。
这样就产生了一个矛盾,如果不配置ContextLoaderListener,CXF就无法正常使用。但如果配置ContextLoaderListener,又会造成Spring的重复加载(DispatcherServlet一次,ContextLoaderListener一次)。
不明白,求大神指点,我该如何解决!
------解决思路----------------------
springmvc确实是不需要ContextLoaderListener来加载管理bean的。
DispatcherServlet它有自己的容器,主要用于加载除控制器层的bean,DispatcherServlet属于子容器。
ContextLoaderListener是spring管理bean的父容器,ContextLoaderListener一般用于加载非控制器层的bean。子容器可以访问父容器中的bean,而父容器不能访问子容器。
你可以吧基本web请求的controller等这些bean放到dispatcher-servelet.xml中,让DispatcherServlet去加载管理其中的bean。 把webservice相关的bean配置到另外一个xml文件中,比如applicationContext.xml,让ContextLoaderListener去加载管理applicationContext.xml中的bean,这样算是在两个不同的容器当中,就互不影响了。
ps:下班要走了,有点词不达意,大概原理是这个意思。