cxf webservice与spring mvc整合问题

unique 2014-02-19 06:34:04
项目运用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一次)。

不明白,求大神指点,我该如何解决!
...全文
2774 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36378033 2016-10-24
  • 打赏
  • 举报
回复
这个问题解决了没?
smile13 2016-04-29
  • 打赏
  • 举报
回复
楼主解决这个问题没?楼上说的配置文件分离,也不行,我试过了。
xfInNet 2015-11-24
  • 打赏
  • 举报
回复
配置文件分离 http://kyfxbl.iteye.com/blog/1432920
lutghj1990 2015-11-17
  • 打赏
  • 举报
回复
我也遇到同样的问题,spring mvc 和cxf,报错也是一样,楼主有没有解决啊
温柔岁月 2015-10-22
  • 打赏
  • 举报
回复
这个问题解决了没有呢
玲姐mike 2015-03-17
  • 打赏
  • 举报
回复
我擦,这个问题就没有个官方的解决办法么?查了好多地方都没找到解决办法!
taigeer123 2015-03-17
  • 打赏
  • 举报
回复
我也在找这个问题
魂不守舍 2014-12-17
  • 打赏
  • 举报
回复
你问题解决了吗?我也一直在困惑呢!
bridge_ca 2014-04-08
  • 打赏
  • 举报
回复
引用 7 楼 hotsmile 的回复:
[quote=引用 6 楼 bridge_ca 的回复:] <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ContextLoaderListener都没有写,java bean注入肯定出错啊!
我是加了,实现类调用其他的service 还是无法注入,只能通过显示的ctx.getBean()调用,求大神指教!!!!!!!!!1[/quote] 拆分配置文件具体参考:http://kyfxbl.iteye.com/blog/1432920
jack40883 2014-04-08
  • 打赏
  • 举报
回复
我去,跟我问题一样..大哥你解决了没?
wyx100 2014-03-30
  • 打赏
  • 举报
回复
查配置文件,注意大小写
hotsmile 2014-03-29
  • 打赏
  • 举报
回复
引用 6 楼 bridge_ca 的回复:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ContextLoaderListener都没有写,java bean注入肯定出错啊!
我是加了,实现类调用其他的service 还是无法注入,只能通过显示的ctx.getBean()调用,求大神指教!!!!!!!!!1
bridge_ca 2014-03-24
  • 打赏
  • 举报
回复
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ContextLoaderListener都没有写,java bean注入肯定出错啊!
在下钟馗 2014-02-20
  • 打赏
  • 举报
回复
<!--导入与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" /> 是这些配置文件中的bean吗?
unique 2014-02-20
  • 打赏
  • 举报
回复
引用 4 楼 u013553546 的回复:
<!--导入与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" /> 是这些配置文件中的bean吗?
不是的呢,那三个文件是cxf框架已经打包好,没问题的。控制台提示的是我自己写的普通java bean的注入出问题。我猜测应该就是web.xml的配置上不合理,spring mvc的配置与cxf的配置不能共存在同一容器中。参考:http://blog.csdn.net/weu135/article/details/13016343 这个帖的内容。始终还是一知半解,不懂有没更好的方法解决!
unique 2014-02-19
  • 打赏
  • 举报
回复
引用 1 楼 u013553546 的回复:
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:下班要走了,有点词不达意,大概原理是这个意思。
感谢你的回答帮助,你的意思我大概也懂! 然后我把web.xml配置修改成了:
<context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/cxf.xml</param-value>   
   </context-param>
  
  <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/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>  
	<load-on-startup>2</load-on-startup> 
  </servlet>
  <servlet-mapping>   
    <servlet-name>CXFWebService</servlet-name>   
    <url-pattern>/ws/*</url-pattern>   
  </servlet-mapping>
applicationContext.xml配置代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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.xsdd">


     <!-- 配置Bs -->  

    <bean id="userBS" class= "com.pms.bs.impl.UserBSImpl">  
	 	<property name="userDao">
			<ref bean="userDao" />
		</property>
    </bean>
    
    <bean id="photoBS" class= "com.pms.bs.impl.PhotoBSImpl">  
	 	<property name="photoDao">
			<ref bean="photoDao" />
		</property>
    </bean>
    
    <bean id="categoryBS" class= "com.pms.bs.impl.CategoryBSImpl">  
	 	<property name="categoryDao">
			<ref bean="categoryDao" />
		</property>
    </bean>
//省略……
</beans>
cxf.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>
结果这时又出现问题,定义的bean无法自动注入。 真是头疼,该如何解决呢?谁有遇到过的,帮忙解决下!
在下钟馗 2014-02-19
  • 打赏
  • 举报
回复
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:下班要走了,有点词不达意,大概原理是这个意思。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧