Mule web service调用中的复杂类型传递

来源:互联网 发布:js代码以文本格式输出 编辑:程序博客网 时间:2024/06/08 16:18

Mule版本: 1.4.4 

  官网上很辛苦在一个旮旯里找到如何向 Mule暴露的axis web service 传递复杂数据类型 ,http://www.mulesource.org/pages/viewpage.action?pageId=4678, 官网上只提供了原理,自己补充了一下客户端测试代码,部分服务类做了修改。 
    
  类清单: 
  Person: 数据类,测试复杂数据类型的传递 
  PersonService: 服务接口类 
  PersonServiceImpl: 服务实现类。 
  PersonServiceLaucher: Mule服务器启动类 
  PersonClient: 客户端测试类。 
  person-config.xml, Mule 配置,其中将 PersonServiceImpl 暴露为一个axis1.4的服务。 

1. Person数据类 
Java代码  收藏代码
  1.  public class Person   
  2.   {  
  3. private String name;  
  4. private String surname;  
  5. private Date registerDate = new Date();  
  6. private int age = 20;  
  7.    ...  


2.  服务接口类 
Java代码  收藏代码
  1.  public interface PersonService {     
  2. String printPerson(Person person) ;   
  3. Person createPerson(String name,String surname,int age);      
  4.     Person[] batchCreatePerson(String namePattern);  
  5.  }  


3. 实现类: 
Java代码  收藏代码
  1. package demo.mule.person;  
  2.   
  3. public class PersonServiceImpl implements PersonService {  
  4.     public String printPerson(Person person) {        
  5.         return "person:name=" + person.getName() +",surname=" + person.getSurname();  
  6.     }  
  7.       
  8.     /** 
  9.      * test return a complex type by web service 
  10.      */  
  11.     public Person createPerson(String name, String surname,int age) {  
  12.         Person p = new Person(name,surname);  
  13.         p.setAge(age);  
  14.         System.out.println("a person is created:" + p.getName());  
  15.         return p;  
  16.     }  
  17.       
  18.     public Person[] batchCreatePerson(String namePattern) {  
  19.         Person[] persons = new Person[3];  
  20.         for (int i = 0; i < persons.length; i++) {  
  21.             Person p = new Person(namePattern + i,namePattern + i);  
  22.             p.setAge( 20 + i );  
  23.             persons[i] = p;  
  24.         }  
  25.         return persons;  
  26.     }  
  27. }  


4. person-config.xml 
Xml代码  收藏代码
  1.   <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN" "http://mule.mulesource.org/dtds/mule-configuration.dtd">  
  3. <mule-configuration id="mule-test" version="1.0">  
  4.     <model name="personService">  
  5.         <!-- test: http://localhost:8082/services/personService?method=createPerson -->             
  6.         <mule-descriptor name="personService" implementation="demo.mule.person.PersonServiceImpl">  
  7.             <inbound-router>  
  8.                 <endpoint address="axis:http://localhost:8082/services"></endpoint>  
  9.             </inbound-router>       
  10.             <!-- not nessesary   
  11.             <properties>  
  12.                 <property name="style" value="wrapped"/>  
  13.                 <property name="use" value="literal"/>  
  14.             </properties>       
  15.             -->  
  16.         </mule-descriptor>              
  17.     </model>  
  18. </mule-configuration>  



5. server启动 
Java代码  收藏代码
  1.   public class PersonServiceLaucher {  
  2. public static void main(String[] args) throws ConfigurationException {  
  3.     MuleXmlConfigurationBuilder muleXmlConfigurationBuilder = new MuleXmlConfigurationBuilder();  
  4.     UMOManager manager = muleXmlConfigurationBuilder.configure("demo/mule/person/person-config.xml");  
  5. }  



6. 测试类 
Java代码  收藏代码
  1.  public class PersonClient {      
  2.     private MuleClient muleClient ;   
  3.     public PersonClient() {  
  4.         try {  
  5.             muleClient = new MuleClient();  
  6.         } catch (UMOException e) {        
  7.             e.printStackTrace();  
  8.         }  
  9.     }  
  10.   
  11.     public void testPrintPerson() throws Exception {  
  12.           
  13.         Person person = new Person("David","Jones");  
  14.         UMOMessage msg = new MuleMessage(person );  
  15.         UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=printPerson",msg);  
  16.           
  17.         System.out.println("message:" + message.getPayloadAsString());  
  18.     }  
  19.       
  20.     public void testCreatePerson() throws Exception {  
  21.         Object[] args = new Object[]{"小龙","李"new Integer(23)};  
  22.         UMOMessage msg = new MuleMessage(args );  
  23.         UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=createPerson",msg);  
  24.       
  25.         Person p = (Person)message.getPayload();  
  26.         System.out.println("message:" + message.getPayloadAsString());  
  27.         System.out.println("payload:" + p.getName() +"," + p.getSurname() +"," + p.getAge());  
  28.     }  
  29.       
  30.     public void testBatchCreatePerson() throws UMOException {  
  31.         Object[] args = new Object[]{"Admin"};  
  32.         UMOMessage msg = new MuleMessage(args );  
  33.         UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=batchCreatePerson",msg);  
  34.           
  35.         Person[] ps = (Person[])message.getPayload();  
  36.         System.out.println("persons:" + ps.length);  
  37.         for (int i = 0; i < ps.length; i++) {  
  38.             Person p = ps[i];  
  39.             System.out.println("person:" + p.getName() +"," + p.getSurname() +"," + p.getAge());  
  40.         }         
  41.     }  
  42.     public static void main(String[] args) throws Exception {  
  43.         PersonClient personClient = new PersonClient();  
  44.         personClient.testPrintPerson();  
  45.         personClient.testCreatePerson();          
  46.         personClient.testBatchCreatePerson();  
  47.     }  
  48. }  



测试过程: 
1) 启动Mule服务容器 
2) 执行PersonClient 


总结: 
  1) Mule暴露POJO为一个服务还是很简单的, 配置非常少 
  2) 传递和返回Java复杂数据类型,自定义数据类型都非常方便。不过,客户端需要明确知道每个方法传递的参数个数和类型,以及返回的参数类型,并且需要自己type cast。 在具体项目中,可以自己再做一层封装或用AOP, 以本地调用的方式调用 mule 的web service。 

原创粉丝点击