整合XFire与Spring, 发布 Webservice 以及客户端的访问方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BAStriver/article/details/82799465

1.首先第一步当然是先下载好服务端的依赖了; 服务端依赖包

2.新建Web工程,为了后续的客户端的测试,还需加入commons- httpclient.jar包到WEB-INF/lib下哦;

3.在web.xml中配置 XFireSpringServlet,将Spring容器中定义的Web Service在某个URI下发布:

<xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <display-name>XFireService</display-name>
    <!-- begin Spring配置 -->
    <context-param>
       <param-name>contextConfigLocation</param-name>
       <param-value>/WEB-INF/applicationContext.xml,/WEB-INF/xfire-servlet.xml</param-value>
    </context-param>
    <listener>
       <listener-class> org.springframework.web.context.ContextLoaderListener
       </listener-class>
    </listener>
     <listener> 
       <listener-class>     org.springframework.web.util.IntrospectorCleanupListener
       </listener-class>
    </listener>
    <!-- end Spring配置 -->

    <!-- begin XFire 配置 -->
    <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>*.ws</url-pattern>
    </servlet-mapping>
    <servlet>
       <!-- 配合Spring容器中XFire一起工作的Servlet-->
       <servlet-name>xfireServlet</servlet-name>
       <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
    </servlet>
    <servlet-mapping>
       <servlet-name>xfireServlet</servlet-name>
       <!-- 在这个URI下开放Web Service服务 -->
       <url-pattern>/service/*</url-pattern>
    </servlet-mapping>
    <!-- end XFire 配置 -->
</web-app>

4.在WEB-INF下建立两个配置Spring配置文件,一个为applicationContext.xml,该文件用来定义本工程的bean,一个为xfire-servlet.xml,用来配置XFire的相关bean;

5.那么,现在来建接口HelloWorld、实现类HelloWorldImpl

package webservice;

public interface HelloWorld {
    
    String sayHelloWorld(String name);
}
package webservice;

public class HelloWorldImpl implements HelloWorld {
    public String sayHelloWorld(String name) {
       String helloWorld = "hello," + name;
       return helloWorld;
    }
}

5.在applicationContext.xml文件中配置对应的bean:HelloWorldBean

<beans>
    <bean id="HelloWorldBean" class="webservice.HelloWorldImpl"/>
</beans>

6.在xfire-servlet.xml文件中导出器的设置:

<beans>
    <!-- 引入XFire预配置信息 -->
    <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
    <!—定义访问的url-->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="urlMap">             
           <map>                 
              <entry key="/HelloWorldService.ws">                  
                  <ref bean="HelloWorldService" />                 
              </entry>             
           </map>         
       </property>     
    </bean>     

    <!-- 使用XFire导出器 -->
    <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true">
       <!-- 引用xfire.xml中定义的工厂 -->
       <property name="serviceFactory" ref="xfire.serviceFactory" />
       <!-- 引用xfire.xml中的xfire实例 -->
       <property name="xfire" ref="xfire" />
    </bean>
    <bean id="HelloWorldService" parent="baseWebService">
       <!-- 业务服务bean -->
       <property name="serviceBean" ref="HelloWorldBean" />
       <!-- 业务服务bean的窄接口类 -->
       <property name="serviceClass" value="webservice.HelloWorld" />
    </bean>
</beans>

以上,简单的Web Service已经编写ok,浏览器输入:http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl。可以看到HelloWorldService对应的WSDL信息,阅读这个WSDL文档,我们可以知道HelloWorld的sayHelloWorld方法已经被成功地发布为Web Service了。

那么接下来,就是客户端的访问了。

有几种访问方式:

  • 获得WSDL文件HelloWorldService.wsdl,将其放在src目录下面,接着我们通过程序访问该WSDL文件,并调用需测试的方法;
  • import org.codehaus.xfire.client.Client;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    import webservice.HelloWorld;
    
    public class WebServiceClientTest { 
        HelloWorld helloWorld = null;
    
        publicstaticvoid main(String[] args) throws Exception {
           WebServiceClientTest test = new WebServiceClientTest();
           test.testClient();
        } 
        
        publicvoid testClient() throws Exception {
           String wsdl = "HelloWorldService.wsdl"; //对应的WSDL文件
           Resource resource = new ClassPathResource(wsdl); 
           Client client = new Client(resource.getInputStream(), null); //根据WSDL创建客户实例
           
           Object[] objArray = new Object[1];
           objArray[0] = "美食";       
           Object[] results = client.invoke("sayHelloWorld", objArray);
           System.out.println("result: " + results[0]);
        }
    }
  • 根据服务地址创建客户端调用程序。在src目录下建立客户端调用的Spring配置文件client.xml;
  • <beans>
        <bean id="testWebService" class="org.codehaus.xfire.spring.remoting.XFireClientFactoryBean">
           <property name="serviceClass">          
               <value>webservice.HelloWorld</value>       
           </property>      
            <property name="wsdlDocumentUrl">         
                <value>http://localhost:8080/webservice_helloworld/HelloWorldService.ws?wsdl</value>       
            </property>      
         </bean>
    </beans>
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import webservice.HelloWorld;
    
    
    publi cclass WebServiceClientTest { 
        HelloWorld helloWorld = null;
    
        publicstaticvoid main(String[] args) {
           WebServiceClientTest test = new WebServiceClientTest();
           test.testClient();
        } 
    
        publicvoid testClient() {
           ApplicationContext ctx = new ClassPathXmlApplicationContext(
                  "client.xml");
           helloWorld = (HelloWorld) ctx.getBean("testWebService");
           System.out.println(helloWorld.sayHelloWorld("美食"));
        }
    }
  • 通过HttpClient访问(推荐)
  • public void test() throws IOException, Exception{		
    
    	Client client = new Client(new URL("http://localhost:8080/Webservice/wsdl/queryService.ws?wsdl"));
    	
    	Object[] objArray = new Object[7];
    	Map<String, Object> params = new HashMap<>();
    	params.put("Condition", "");
    	params.put("RequiredItems", "xm");
    	String json = JSONObject.toJSONString(params);
    	// System.out.println("json = " + json);
    	objArray[0] = json;
    	Object[] results = client.invoke("Query", objArray);
    	System.out.println(" result: " + results[0]);
    		
    }

    使用小结:

  • service里面的方法重载的话会导致wsdl文件里面的接口名称自动更改为‘名称’+数字;

  • service的参数不能包含字符数组,不然会空指针;

  • 尽可能的只发布少的服务接口,将要调用的接口名称传给这个公共接口,然后就可以统一管理在一个公共接口了,以后增加接口也不需要每次都修改xml的配置。

猜你喜欢

转载自blog.csdn.net/BAStriver/article/details/82799465