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

  官网上很辛苦在一个旮旯里找到如何向 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.    ... 
  public class Person
   {
	private String name;
	private String surname;
	private Date registerDate = new Date();
	private int age = 20;
    ...

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); 
  public interface PersonService {
	String printPerson(Person person) ;
	Person createPerson(String name,String surname,int age);
 	Person[] batchCreatePerson(String namePattern);
  }

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.     } 
package demo.mule.person;

public class PersonServiceImpl implements PersonService {
	public String printPerson(Person person) {
		return "person:name=" + person.getName() +",surname=" + person.getSurname();
	}

	/**
	 * test return a complex type by web service
	 */
	public Person createPerson(String name, String surname,int age) {
		Person p = new Person(name,surname);
		p.setAge(age);
		System.out.println("a person is created:" + p.getName());
		return p;
	}

	public Person[] batchCreatePerson(String namePattern) {
		Person[] persons = new Person[3];
		for (int i = 0; i < persons.length; i++) {
			Person p = new Person(namePattern + i,namePattern + i);
			p.setAge( 20 + i );
			persons[i] = p;
		}
		return persons;
	}
}

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> 
  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mule-configuration PUBLIC "-//MuleSource //DTD mule-configuration XML V1.0//EN" "http://mule.mulesource.org/dtds/mule-configuration.dtd">
<mule-configuration id="mule-test" version="1.0">
	<model name="personService">
		<!-- test: http://localhost:8082/services/personService?method=createPerson -->
		<mule-descriptor name="personService" implementation="demo.mule.person.PersonServiceImpl">
			<inbound-router>
				<endpoint address="axis:http://localhost:8082/services"></endpoint>
			</inbound-router>
			<!-- not nessesary
			<properties>
				<property name="style" value="wrapped"/>
				<property name="use" value="literal"/>
			</properties>
			-->
		</mule-descriptor>
	</model>
</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"); 
   public class PersonServiceLaucher {
	public static void main(String[] args) throws ConfigurationException {
		MuleXmlConfigurationBuilder muleXmlConfigurationBuilder = new MuleXmlConfigurationBuilder();
		UMOManager manager = muleXmlConfigurationBuilder.configure("demo/mule/person/person-config.xml");
	}
}

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.     } 
 public class PersonClient {
	private MuleClient muleClient ;
	public PersonClient() {
		try {
			muleClient = new MuleClient();
		} catch (UMOException e) {
			e.printStackTrace();
		}
	}

	public void testPrintPerson() throws Exception {

		Person person = new Person("David","Jones");
		UMOMessage msg = new MuleMessage(person );
		UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=printPerson",msg);

		System.out.println("message:" + message.getPayloadAsString());
	}

	public void testCreatePerson() throws Exception {
		Object[] args = new Object[]{"小龙","李", new Integer(23)};
		UMOMessage msg = new MuleMessage(args );
		UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=createPerson",msg);

		Person p = (Person)message.getPayload();
		System.out.println("message:" + message.getPayloadAsString());
		System.out.println("payload:" + p.getName() +"," + p.getSurname() +"," + p.getAge());
	}

	public void testBatchCreatePerson() throws UMOException {
		Object[] args = new Object[]{"Admin"};
		UMOMessage msg = new MuleMessage(args );
		UMOMessage message = muleClient.send("axis:http://localhost:8082/services/personService?method=batchCreatePerson",msg);

		Person[] ps = (Person[])message.getPayload();
		System.out.println("persons:" + ps.length);
		for (int i = 0; i < ps.length; i++) {
			Person p = ps[i];
			System.out.println("person:" + p.getName() +"," + p.getSurname() +"," + p.getAge());
		}
	}
	public static void main(String[] args) throws Exception {
		PersonClient personClient = new PersonClient();
		personClient.testPrintPerson();
		personClient.testCreatePerson();
		personClient.testBatchCreatePerson();
	}
}

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

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

时间: 2024-12-27 20:31:55

Mule web service调用中的复杂类型传递的相关文章

JAVA+AXIS客户端调用Asp.net Web Service过程中遇到的问题及解决方法

        背景:公司与某运营商合作,运营商提供了接口文档,在文档中规定了数据流是双向的,运营商和公司之间的通讯采用Web Service方式,双方互为客户端和服务器端.这次遇到的问题,就是运营商的客户端调用我公司服务端的Web Service时出现的情况.需要特别说明的是:运营商有几十家合作伙伴,所以客户端的代码是不能因为某一家合作伙伴而修改的,各合作伙伴的WEB SERVICE开发环境也不相同,大部分都是用JAVA语言开发,而我公司是用VS2005开发的.         过程:    

使用Integrated Web Services Client for ILE在ILE程序中调用Web Service 二

什么是Web Service客户端处理器 Web Service客户端处理器(Client Side Handler)是Integrated Web Services Client for ILE提供的一种客户端Web Service调用监听机制,当客户端Stub程序封装好请求SOAP消息准备发送,或者客户端Stub程序接收到响应SOAP消息准备处理时,可以通过客户端Handler机制进行消息监听以及修改SOAP Header信息,然后 Integrated Web Services Clien

在WebSphere Portlet Factory中调用Web Service

通过 WebSphere Portlet Factory(WPF),开发者非常方便实现 Web Service 和 Portlets 的通信.开发者无需花费大量的时间去学习 SOAP,WSDL,XML schema(xsd) 等 Web Service 技术,使用 WPF 即可开发出健壮.功能强大的 Web Service 和实现对各种风格的 Web Service 的调用.WPF 隐藏了 Web Service 的内部实现细节,通过 WPF 的丰富的构建器自动生成 Web Service 和实

使用Integrated Web Services Client for ILE在ILE程序中调用Web Service 一

IBM Integrated Web Services for i是IBM最新发布的在IBM i上的SOA解决方案,包括Integrated Web Services Server for i和Integrated Web Services Client for ILE两部分.Integrated Web Services Server for i使用户能够将ILE RPG 和 COBOL程序快速部署成Web Services,而Integrated Web Services Client fo

Web Service中保持ASP.net的状态

asp.net|web 简介      网络程序开发者们遇到的最普遍的问题就是如何在无状态的基于HTTP协议的交互中保持状态信息.有许多聪明的办法可以解决HTTP协议的无状态问题,例如对每个请求重复发送应用程序数据包.使用HTTP认证机制来将请求映射到特定的用户.使用Cookie来存储一系列请求的状态等.在ASP.net技术中提供了一个非常有效的方案来保持状态,该方案隐藏了所有高难度的,具有挑战性的工作的细节,用户只需简单地使用System.Web.SessionState.HttpSess

使用BizTalk Adatper for Web Service中的策略与技巧

web|策略|技巧 在使用BizTalk Adapter for Web Service的EAI解决方案中,不同的.分离的组件被整合在一起完成统一的商业逻辑.在解决方案中,各种组件必须很好的在一起工作.有两条关键的原则(key principle)可以使得你的BizTalk解决方案更完美: KP1:在搭建解决方案时,每一步实现均进行测试: KP2:丛最前端开始向后端推进,或丛最后端开始并向前端推进,一步一步进行增量开发.每进行一步增量开发,均要保证增量后解决方案可以使用. 下面分别加以描述,并对

Web Service——下一代的WWW[转]

web Web Service一词似乎一夜之间就热了起来.所谓的Web Service是指由企业发布的完成其特别商务需求的在线应用服务其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service是下一代的WWW它允许在Web站点上放置可编程的元素能进行基于Web的分布式计算和处理.Web Service的发展非常迅速这个新规范SOAP.WSDL 和 UDDI的构建模块仅仅才出现了几个月就已经对设计.开发和部署基于 Web 的应用产生了巨大的影响软件产业的巨头和In

Web Service——下一代的WWW

web Web Service一词似乎一夜之间就热了起来.所谓的Web Service是指由企业发布的完成其特别商务需求的在线应用服务其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service是下一代的WWW它允许在Web站点上放置可编程的元素能进行基于Web的分布式计算和处理.Web Service的发展非常迅速这个新规范SOAP.WSDL 和 UDDI的构建模块仅仅才出现了几个月就已经对设计.开发和部署基于 Web 的应用产生了巨大的影响软件产业的巨头和In

什么是Web Service

web 你可能早就听说过Web service了,你也可能已经对Web service有一些概念了.一时间,好像所有的计算机期刊.书籍和网站都开始提及Web service.然而,当前大多数对Web service的介绍都没能清楚的说明Web service到底是什么.他们只是鼓吹Web service是多么多么的好,简直就像是在做广告.在本文中会讲清楚两件事:Web service到底是什么:在什么情况下你应该使用Web service. 分布式应用程序和浏览器研究一下当前的应用程序开发,你会