xfire 和 spring 集成的 两种方式

转自:http://blog.sina.com.cn/s/blog_477252210100a7l4.html

 

1、使用org.codehaus.xfire.spring.XFireSpringServlet与ServiceBean

1.1 web.xml的配置

<web-app>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-webservice.xml
</param-value>
</context-param>
<!-- Log4j configuration listener-->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!-- Spring framework -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>XFireServlet</servlet-name>
<display-name>XFire Servlet</display-name>
<servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>XFireServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>


</web-app>

1.2 applicationContext-webservice.xml的配置:

<beans>

<import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>

<bean name="echoService" class="org.codehaus.xfire.spring.ServiceBean">
<property name="serviceBean" ref="echo"/>
<property name="serviceClass" value="org.codehaus.xfire.test.Echo"/>
<property name="inHandlers">
<list>
<ref bean="addressingHandler"/>
</list>
</property>
</bean>

<bean id="echo" class="org.codehaus.xfire.test.EchoImpl"/>

<bean id="addressingHandler" class="org.codehaus.xfire.addressing.AddressingInHandler"/>

<bean name="bookService" class="org.codehaus.xfire.spring.ServiceBean">
<property name="serviceBean" ref="bookServiceBean"/>
<property name="serviceClass" value="org.codehaus.xfire.demo.BookService"/>
</bean>

<bean id="bookServiceBean" class="org.codehaus.xfire.demo.BookServiceImpl"/>

</beans>

1.3 这样将会发布两个service,BookService和EchoService。随后就可以使用client端进行测试了。

//测试BookService
public static void main(String args[])
{
String serviceURL = "http://127.0.0.1:9001/xfire/services/BookService";
Service serviceModel = new ObjectServiceFactory().create(BookService.class,null,"http://xfire.codehaus.org/BookService",null);
XFireProxyFactory serviceFactory = new XFireProxyFactory();
try
{
BookService service = (BookService) serviceFactory.create(serviceModel, serviceURL);
Client client = Client.getInstance(service);
client.addOutHandler(new OutHeaderHandler());
Book[] books = service.getBooks();
System.out.println("BOOKS:");
for (int i = 0; i < books.length; i++)
{
System.out.println(books[i].getTitle());
}
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
}

1.4 忘了BookService及其实现了。

public interface BookService
{
public Book[] getBooks();

public Book findBook(String isbn);

public Map getBooksMap();
}

 

public class BookServiceImpl implements BookService
{
private Book onlyBook;

public BookServiceImpl()
{
onlyBook = new Book();
onlyBook.setAuthor("Dan Diephouse");
onlyBook.setTitle("Using XFire");
onlyBook.setIsbn("0123456789");
}

public Book[] getBooks()
{
return new Book[] { onlyBook };
}

public Book findBook(String isbn)
{
if (isbn.equals(onlyBook.getIsbn()))
return onlyBook;

return null;
}

public Map getBooksMap() {
Map result = new HashMap();
result.put(onlyBook.getIsbn(), onlyBook);
return result;
}
}

1.5 简单的测试就是通过IE,输入http://ip:port/context/services/BookService?wsdl或者http://ip:port/context/services/EchoService?wsdl,将会出现相应的wsdl文档。

如果只是输入http://ip:port/context/services/BookService,会出现Invalid SOAP request.这也说明配置正确。

2、直接集成Spring(通过Spring的org.springframework.web.servlet.DispatcherServlet)

2.1 web.xml配置
<web-app>
<!-- START SNIPPET: xfire -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:org/codehaus/xfire/spring/xfire.xml</param-value>
</context-param>

<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>

<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
<servlet-name>xfire</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>xfire</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- END SNIPPET: xfire -->
</web-app>
2.2 xfire-servlet.xml配置
<beans>
<!-- START SNIPPET: xfire -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/EchoService">
<ref bean="echo"/>
</entry>
</map>
</property>
</bean>

<bean id="echoBean" class="org.codehaus.xfire.spring.example.EchoImpl"/>

<!-- Declare a parent bean with all properties common to both services -->
<bean id="echo" class="org.codehaus.xfire.spring.remoting.XFireExporter">
<property name="serviceFactory">
<ref bean="xfire.serviceFactory"/>
</property>
<property name="xfire">
<ref bean="xfire"/>
</property>
<property name="serviceBean">
<ref bean="echoBean"/>
</property>
<property name="serviceClass">
<value>org.codehaus.xfire.spring.example.Echo</value>
</property>
</bean>
<!-- END SNIPPET: xfire -->
</beans>
2.3 余下的配置跟第一种方法一样。

3、另外xfire的官方文档上还有一种方法,是通过XBean与Spring结合来实现webservice的expose。还是觉得上面的两种方法比较好。既然已经与spring集成在一起了,何必再引入其他的呢?以后的维护是不是也要有问题呢?

 

posted @ 2013-07-28 00:58  roscee  阅读(1022)  评论(0编辑  收藏  举报