通常在Spring发布Hession,RMI等,是非常方便的,
但是要发布SOAP类型的WebService则要依赖一个独立的Servlet容器(如Tomcat+Axis),
1 // Create an XFire Service
2 ObjectServiceFactory serviceFactory = new ObjectServiceFactory();
3 Service service = serviceFactory.create(Echo. class );
4 service.setInvoker( new BeanInvoker( new EchoImpl()));
5 // Register the service in the ServiceRegistry
6 XFire xfire = XFireFactory.newInstance().getXFire();
7 xfire.getServiceRegistry().register(service);
8 // Start the HTTP server
9 XFireHttpServer server = new XFireHttpServer();
10 server.setPort( 8191 );
11 server.start();
这样的话,如果发布多个WebSerice则要依次显式的创建 XFire Service,然后再一一注册,
这样显然是不够优雅的。
我们想要让开发者在Spring配置文件中指定要发布为WebService的POJOs,
然后载入Spring环境就自动发布为webservice,而不需要跟 XFire API打交道。
首先,我们想要一个BeanFacory,能把一个pojo装配成XFire Service
1 /**
2 *
3 */
4 package com.yovn.ws.xfire.example;
5
6 import org.codehaus.xfire.service.Service;
7 import org.codehaus.xfire.service.binding.BeanInvoker;
8 import org.codehaus.xfire.service.binding.ObjectServiceFactory;
9 import org.springframework.beans.factory.FactoryBean;
10
11 /**
12 * @author new
13 *
14 */
15 public class XFireServiceFactoryBean implements FactoryBean
16 {
17
18
19
20
21 private Class serviceClass;
22
23
24 private Object target;
25
26
27 private Service service;
28
29
30 private final ObjectServiceFactory sf = new ObjectServiceFactory();
31
32 /**
33 *
34 */
35 public XFireServiceFactoryBean()
36 {
37
38 }
39
40 /* (non-Javadoc)
41 * @see org.springframework.beans.factory.FactoryBean#getObject()
42 */
43 public Object getObject() throws Exception
44 {
45 if (service == null )
46 {
47 service = sf.create(serviceClass);
48 service.setInvoker( new BeanInvoker(target));
49 }
50 return service;
51 }
52
53 /* (non-Javadoc)
54 * @see org.springframework.beans.factory.FactoryBean#getObjectType()
55 */
56 public Class getObjectType()
57 {
58
59 return Service. class ;
60 }
61
62 /* (non-Javadoc)
63 * @see org.springframework.beans.factory.FactoryBean#isSingleton()
64 */
65 public boolean isSingleton()
66 {
67 return true ;
68 }
69
70 public void setServiceClass(Class serviceClass)
71 {
72 this .serviceClass = serviceClass;
73 }
74
75 public void setTarget(Object target)
76 {
77 this .target = target;
78 }
79
80 }
81
这样我们可以通过Spring来装配一个pojo,
下一步我们要在Spring容器载入时候注册XFire Service,
并启动一个嵌入的Http Server,我们可以借助Spring的ApplicationListener来实现
Ok,我们完成基础的代码,下面试着发布一个简单的WebServie1 /**
2 *
3 */
4 package com.yovn.ws.xfire.example;
5
6
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.codehaus.xfire.XFire;
10 import org.codehaus.xfire.XFireFactory;
11 import org.codehaus.xfire.server.http.XFireHttpServer;
12 import org.codehaus.xfire.service.Service;
13 import org.codehaus.xfire.service.ServiceRegistry;
14 import org.springframework.context.ApplicationContext;
15 import org.springframework.context.ApplicationEvent;
16 import org.springframework.context.ApplicationListener;
17 import org.springframework.context.event.ContextClosedEvent;
18 import org.springframework.context.event.ContextRefreshedEvent;
19
20 /**
21 * @author new
22 *
23 */
24 public class XFireServiceStarter implements ApplicationListener
25 {
26
27 private int port = 80 ;
28
29 private XFireHttpServer server;
30 private final Log logger = LogFactory.getLog(getClass().getName());
31
32 public void setPort( int port)
33 {
34 this .port = port;
35 }
36
37 public void onApplicationEvent(ApplicationEvent event)
38 {
39 try
40 {
41 if (event instanceof ContextRefreshedEvent)
42 {
43
44 if (server != null )
45 {
46
47 server.stop();
48 logger.info( " xfire server stopped " );
49
50 }
51 registerService((ApplicationContext)event.getSource());
52 server = new XFireHttpServer();
53 server.setPort(port);
54 server.start();
55 logger.info( " xfire server started " );
56
57 } else if (event instanceof ContextClosedEvent)
58 {
59 if (server != null )
60 {
61 server.stop();
62 logger.info( " xfire server stopped " );
63 }
64
65 }
66
67 } catch (Exception e)
68 {
69 logger.error( " process event " + event + " error " ,e);
70 }
71
72 }
73
74 private void registerService(ApplicationContext context)
75 {
76 XFire xfire = XFireFactory.newInstance().getXFire();
77 ServiceRegistry registry = xfire.getServiceRegistry();
78 String names[] = context.getBeanNamesForType(Service. class );
79
80 for ( int i = 0 ;i < names.length;i ++ )
81 {
82 Service service = (Service)context.getBean(names[i]);
83 registry.register(service);
84 logger.info( " register service: " + service.getName());
85 }
86
87 }
88
89 }
90
该接口的实现如下1 package com.yovn.ws.xfire.example;
2
3 public interface Add
4 {
5 int add( int a, int b);
6
7 }