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的实例
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());