当前位置: 代码迷 >> Java Web开发 >> cxf webservice与spring mvc整合有关问题
  详细解决方案

cxf webservice与spring mvc整合有关问题

热度:1095   发布时间:2016-04-13 22:16:58.0
cxf webservice与spring mvc整合问题
项目运用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:下班要走了,有点词不达意,大概原理是这个意思。
  相关解决方案