XFire 是 codeHaus 组织提供的一个开源框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。
XFire 目前最新的版本是 1.2.6,目前支持的特性主要包括:
- 支持将 Web 服务绑定到 POJO、XMLBeans、JAXB1.1、JAXB2.0 和 Castor;
- 支持基于 HTTP、JMS、XMPP 等多种协议访问 Web 服务;
- 支持多种 Web 服务业界重要标准如 SOAP、WSDL、Web 服务寻址(WS-Addressing)、Web 服务安全(WS-Security)等;
- 支持 JSR181,可以通过 JDK5 配置 Web 服务;
- 高性能的 SOAP 实现;
- 服务器端、客户端代码辅助生成;
- 对 Spring、Pico、Plexus 等项目的支持等。
使用过axis2,对比发现xfire真的很快捷、很方便,学习起来也比较容易
xfire发布pojo webservice有2种方式:
1.通过WEB-INF\classes\META-INF\xfire\services.xml文件发布pojo
WEB-INF\classes\META-INF\xfire\services.xml
<beans xmlns="http://xfire.codehaus.org/config/1.0"> <service> <name>HelloWorldService</name> <namespace>http://vivianj.org/HelloWorldService</namespace> <serviceClass> org.vivianj.xfire.pojo.HelloWorldService </serviceClass> <implementationClass> org.vivianj.xfire.pojo.HelloWorldServiceImpl </implementationClass> </service> </beans>
WEB-INF\web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <display-name>XFire Service</display-name> <description> 基于XFire框架发布Web服务 </description> <servlet> <servlet-name>XFireServlet</servlet-name> <display-name>XFire Servlet</display-name> <servlet-class> org.codehaus.xfire.transport.http.XFireConfigurableServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/servlet/XFireServlet/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> </web-app>
这种方式比较繁琐,如果使用ant或maven来操作也是比较简单的
2.通过spring配置发布pojo
WEB-INF\applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/> <bean id="echoBean" class="org.codehaus.xfire.spring.example.EchoImpl"/> <bean id="helloWorldService" class="org.vivianj.xfire.pojo.HelloWorldServiceImpl"/> </beans>
WEB-INF\xfire-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- START SNIPPET: xfire --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/EchoService"> <ref bean="echo" /> </entry> <entry key="/HelloWorldService"> <ref bean="helloWorld" /> </entry> </map> </property> </bean> <!-- 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> <bean id="helloWorld" 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="helloWorldService" /> </property> <property name="serviceClass"> <value>org.vivianj.xfire.pojo.HelloWorldService</value> </property> </bean> <!-- END SNIPPET: xfire --> </beans>
WEB-INF\web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <!-- START SNIPPET: xfire --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.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>/services/*</url-pattern> </servlet-mapping> <!-- END SNIPPET: xfire --> </web-app>
这种方式直接整合在项目中,直接打包为web项目就能发布成功,无需生成xfire的标准服务结构