Spring+XFire开发[web service]
经过4天的努力,终于把XFire和Spring结合起来做了一个web service发布成功了!
首先建立一个工程,创建一个接口(XFiceFace):
package com.fire.face;
public interface XFireFace {
public int doAdd(int i,int k);
}
接着创建有一个实现类(XFireFace):
package com.fire.imservlet;
import com.fire.face.XFireFace;
public class XFireFaceIm implements XFireFace{
public int doAdd(int i,int k){
return i+k;
}
}
看过我前面文章的朋友很容易想到会去建立一个META-INF/xfire/service.xml文件.
因为集成了Spring,再次可以不必了.
因为web服务的定义在xfire-servlet.xml中可以找到。
接下来就该写配置文件了.
在WEB-INF文件夹下创建applicationContext.xml文件,这是Spring的配置文件.
需要说明的是,这个文件很重要.
里面的BEAN ,必须设置正确,然后在 XXX-SERVLET.XML 中把接口类和实现类都指定好才行.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//Spring//DTD Bean//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- Application Context -->
<beans>
<bean id="xfim"
class="com.fire.imservlet.XFireFaceIm"/>
<bean id="domInHandler"
class="org.codehaus.xfire.util.dom.DOMInHandler" />
<bean id="wss4jTokenHandler"
class="org.codehaus.xfire.security.wss4j.WSS4JInHandler" />
</beans>
其中xfim这个bean,就是本工程发布的实现类
你可以只写一个...
当然你也可以在这个文件中定义其他的需要Spring管理的bean。
接下来配置xfire-servlet.xml
在WEB-INF文件夹下创建
根据Spring规范,我把这个文件名起做xfire-servlet.xml.
需要注意的是此处的xfire是在web.xml当中配置的DispatcherServlet的名称.
其中xfim是我在applicationContext.xml中配置的那个Bean.
map就是java.util.map
因为是个集合类.
此处实现了Spring的注入!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//Spring//DTD Bean//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<!-- Application Context -->
<beans>
<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/XFireFace">
<ref bean="XFireService"/>
</entry>
</map>
</property>
</bean>
<bean id="XFireService"
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="xfim"/>
</property>
<property name="serviceClass">
<value>com.fire.face.XFireFace</value>
</property>
</bean>
</beans>
最后就是修改web.xml文件了
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
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">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml
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>
</web-app>
OK此时启动服务器,我用的是tomcat5.0.28
控制台会输入如下信息,log4j有一个警告,不需管它!
log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.Embedded).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN No appenders could be found for logger (org.apache.commons.beanutils.ConvertUtils).
log4j:WARN Please initialize the log4j system properly.
然后可以在浏览器访问:http://localhost:8080/xfire/XFireFace?wsdl
浏览器输出以下服务信息,代表发布成功!
你将可以通过http://localhost:8080/xfire/XFireFace来调用此服务了!
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope" xmlns:soapenc11="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenc12="http://www.w3.org/2003/05/soap-encoding" xmlns:tns="http://face.fire.com" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://face.fire.com">
- <wsdl:types>
- <xsd:schema targetNamespace="http://face.fire.com" elementFormDefault="qualified" attributeFormDefault="qualified">
- <xsd:element name="doAdd">
- <xsd:complexType>
- <xsd:sequence>
<xsd:element name="in0" type="xsd:int" minOccurs="1" maxOccurs="1" />
<xsd:element name="in1" type="xsd:int" minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
- <xsd:element name="doAddResponse">
- <xsd:complexType>
- <xsd:sequence>
<xsd:element name="out" type="xsd:int" minOccurs="1" maxOccurs="1" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
- <wsdl:message name="doAddResponse">
<wsdl:part element="tns:doAddResponse" name="parameters" />
</wsdl:message>
- <wsdl:message name="doAddRequest">
<wsdl:part element="tns:doAdd" name="parameters" />
</wsdl:message>
- <wsdl:portType name="XFireFacePortType">
- <wsdl:operation name="doAdd">
<wsdl:input message="tns:doAddRequest" name="doAddRequest" />
<wsdl:output message="tns:doAddResponse" name="doAddResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="XFireFaceHttpBinding" type="tns:XFireFacePortType">
<wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="doAdd">
<wsdlsoap:operation soapAction="" />
- <wsdl:input name="doAddRequest">
<wsdlsoap:body use="literal" />
</wsdl:input>
- <wsdl:output name="doAddResponse">
<wsdlsoap:body use="literal" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="XFireFace">
- <wsdl:port binding="tns:XFireFaceHttpBinding" name="XFireFaceHttpPort">
<wsdlsoap:address location="http://localhost:8080/xfire/XFireFace" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>