cxf整合springmvc

这个东西弄了一整天,网上参差不齐的例子搞的头都混乱的,结合了多个例子,处理了多个异常之后,终于成功了。

1.首先要倒入所需要的包

cxf-2.7.8.jar  
neethi-3.0.2.jar  
xmlschema-core-2.0.3.jar  
wsdl4j-1.6.3.jar  
asm-3.3.jar  
stax2-api-3.1.x.jar 
woodstox-core-asl-4.2.x.jar

注意,这个包要直接复制到web-inf的lib目录下,不能通过java build path里add进来,不然会报找不到META-INF/cxf/cxf.xml的异常。


2.web.xml里增加配置

    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:applicationContext.xml</param-value>  
    </context-param>
    
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>
    
    <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>*.html</url-pattern>
    </servlet-mapping> 
    
    <servlet>  
         <servlet-name>CXFServlet</servlet-name>  
         <servlet-class>  
                org.apache.cxf.transport.servlet.CXFServlet  
         </servlet-class>  
         <load-on-startup>2</load-on-startup>  
     </servlet>  
  
     <servlet-mapping>  
         <servlet-name>CXFServlet</servlet-name>  
        <url-pattern>/services/*</url-pattern>  
     </servlet-mapping>

3.在src目录下增加个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" xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="  
 http://www.springframework.org/schema/beans   
 http://www.springframework.org/schema/beans/spring-beans.xsd   
 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<jaxws:endpoint id="greetingService1111"
		implementorClass="net.spring.webservice2.GreetingServiceImpl" address="/wsPostName1111" />
</beans>   


4.写个接口

package net.spring.webservice2;

import javax.jws.WebService;

@WebService
public interface GreetingService {
	public String greeting(String userName);
}


5.实现接口的类

package net.spring.webservice2;

import java.util.Calendar;

import javax.jws.WebService;

@WebService(endpointInterface = "net.spring.webservice2.GreetingService")
public class GreetingServiceImpl implements GreetingService {

	@Override
	public String greeting(String userName) {
		return "Hello " + userName + ", currentTime is "
				+ Calendar.getInstance().getTime();
	}

}


6.启动服务器,然后写个测试类

package net.spring.webservice2;

import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class TestWs {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建WebService客户端代理工厂
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
		// 注册WebService接口
		factory.setServiceClass(GreetingService.class);
		// 设置WebService地址
		factory.setAddress("http://localhost:8080/springtest/services/wsPostName1111");
		GreetingService greetingService = (GreetingService) factory.create();
		System.out.println("invoke webservice...");
		System.out.println("message context is:" + greetingService.greeting("gary"));
	}

}

控制台打印结果:

invoke webservice...
message context is:Hello gary, currentTime is Tue Dec 01 16:48:53 CST 2015


========================================分割线====================================================================


spring 客户端调用

1.在applicationContext.xml加入客户端的配置信息

        <jaxws:client id="testServiceClient" serviceClass="net.spring.webservice2.GreetingService"
		address="http://localhost:8080/springtest/services/wsPostName1111">
	</jaxws:client>


 2.controller里调用 

	@RequestMapping(value = "webservice", method = RequestMethod.GET)
	public void webservice(HttpServletRequest request){
//		// 创建WebService客户端代理工厂
//		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
//		// 注册WebService接口
//		factory.setServiceClass(GreetingService.class);
//		// 设置WebService地址
//		factory.setAddress("http://localhost:8080/springtest/services/wsPostName1111");
//		GreetingService greetingService = (GreetingService) factory.create();
//		System.out.println("invoke webservice...");
//		System.out.println("message context is:" + greetingService.greeting("gary"));
		
		ServletContext servletContext = request.getSession().getServletContext();    
		ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext); 
		GreetingService service = (GreetingService)ctx.getBean("testServiceClient");
		System.out.println("message context is:" + service.greeting("gary"));
	}

控制台打印结果:message context is:Hello gary, currentTime is Wed Dec 09 09:53:33 CST 2015

======================================================================

客户端调用如果出现以下异常的话

org.apache.cxf.binding.soap.SoapFault: Unexpected wrapper element

是因为服务端的接口和客户端的接口的包名不一样,所以要在客户端的接口上加上一句话

如果服务端的包名是com.test111.server,客户端的报名是com.test222.server,那么客户端的接口类上要这样写

@WebService(targetNamespace = "http://server.test111.com/")


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值