cxf在spring环境下 做到不依赖spring发布webservice

cxf是创建bus的时候会去jar包的META-INF目录下寻找org.apache.cxf.bus.factory这个文件

这个文件的内容是

org.apache.cxf.bus.spring.SpringBusFactory
org.springframework.context.ApplicationContext

当你的环境是spring的换件 而且classpath下他找到了

org.apache.cxf.bus.spring.SpringBusFactory
org.springframework.context.ApplicationContext这2个类 ,随后他会去调用SpringBusFactory这个类,

这个类他引用了spring的jar中的beans类 如果你的spring版本和他所引入的不一致,那么就会导致 classnotfoundexception,大多数情况 我们不可能为了引入一个cxf而改变公司原有的spring版本结构,而我遇到的问题是对方公司的webservce要求用cxf2.4版本(那里要求的是spring3.0而这个系统比较老是spring1的),因此换了一种方式调用

JaxWsProxyFactoryBean proxyFactory =new JaxWsProxyFactoryBean();

使用JaxWsProxyFactoryBean 的setBus方法

调用busfactory产生cxf自带cxfbusfactory的实例

扫描二维码关注公众号,回复: 625865 查看本文章

proxyFactory.setBus(BusFactory.newInstance(BusFactory.DEFAULT_BUS_FACTORY).createBus());

ok 问题解决了 希望对后来人有点帮助

接下来提供一个实例 (我这边spring1.0环境+cxf独立发布webservice)

1.写接口

目录结构

package

   hello

        HelloService.java

        HelloServiceImpl.java

        User.java

接下来上代码

HelloService

package hello;
import java.util.List;

import javax.jws.WebService;


@WebService
public interface HelloService {
	public List<User> say();
	
	public String show();
	
}

 HelloServiceImpl

package hello;
import java.util.ArrayList;
import java.util.List;

import javax.jws.WebService;

@WebService
public class HelloServiceImpl implements HelloService{
	@Override
	public List<User> say(){
		
		List<User> list = new ArrayList<User>();
		list.add(new User("user1id","user1name"));
		return list;
	}

	@Override
	public String show() {
		return "hello";
	}
}

 User

package hello;
import java.io.Serializable;

public class User implements Serializable{
	
	private static final long serialVersionUID = 4143304866886285361L;
	public User(){
		
	}
	
	public User(String id,String name){
		this.id=id;
		this.name=name;
	}
	private String id;
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}

}

2.创建服务

//创建WebService服务工厂 
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();  
//注册WebService接口   
factory.setServiceClass(HelloServiceImpl.class);  
//这里有个误区 

//这句话不能加,加了可能会认为是跟spring关联的 最终导致客户端访问时出现 反射出错 

//Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: object is 

//not an instance of declaring class while invoking public java.util.List 

//hello.HelloServiceImpl.say() with params [].

//factory.setServiceBean(HelloServiceImpl.class)


//调用默认的busfactory
factory.setBus(BusFactory.newInstance(BusFactory.DEFAULT_BUS_FACTORY).createBus());
//发布接口   
factory.setAddress("http://192.168.0.21:9000/HelloService");
//下面可以添加各种拦截器  
//factory.getInInterceptors().add();  
//factory.getInFaultInterceptors().add();
//factory.getOutInterceptors().add();
//创建WebService   
factory.create(); 

 

 3.创建客户端

String address ="http://192.168.0.21:9000/HelloService";
	JaxWsProxyFactoryBean proxyFactory =new JaxWsProxyFactoryBean();
	proxyFactory.setAddress(address);
	//若客户端也带有springjar包而且是1版本的 那么客户端也要加这句话 调用默认的busfactory,否则不用加这句
//	proxyFactory.setBus(BusFactory.newInstance(BusFactory.DEFAULT_BUS_FACTORY).createBus());
	proxyFactory.setServiceClass(HelloService.class);
	HelloService service = (HelloService) proxyFactory.create();
	System.out.println(service.say().get(0).getName());

猜你喜欢

转载自zwxiaole.iteye.com/blog/1833676