首先,我们在eclipse中建立一个WebService工程作为服务端,并编写如下代码:
IHelloService.java? 服务接口,有一个方法,参数和返回值均为复杂类型User
?

package
?test;



public
?
interface
?IHelloService?
...
{

???public?User?getUser(User?user);

}

?
User.java
注意,这个javabean里必须要有一个默认没有参数的构造方法,否则在进行aegis绑定会有不能实例化user对象的异常

package
?test;


import
?java.io.Serializable;



public
?
class
?User
...
{

??private?String?username;

??private?String?password;


??public?User()...{

??????

??}


public?User(String?username,?String?password)?...{

????super();

????this.username?=?username;

????this.password?=?password;

}


public?String?getPassword()?...{

????return?password;

}


public?void?setPassword(String?password)?...{

????this.password?=?password;

}


public?String?getUsername()?...{

????return?username;

}


public?void?setUsername(String?username)?...{

????this.username?=?username;

}

}

HelloServiceImpl.java
方法实现是传进来一个user对象,把这个对象的username,password变成我们设置的数值,然后返回这个对象

package
?test;



public
?
class
?HelloServiceImpl?
implements
?IHelloService?
...
{



????public?void?print()?...{

????????System.out.println("action");


????}



????public?User?getUser(User?user)?...{

????

????????user.setUsername("new?name");

????????user.setPassword("new?password");

????????return?user;

????}


}

IHelloService.aegis.xml 为复杂参数和返回类型绑定,和IHelloService在一个包下
?

<?
xml?version="1.0"?encoding="UTF-8"
?>


<
mappings
>

????
<
mapping
>

????????
<
method?
name
="getUser"
>

????????????
<
parameter?
index
="0"
?componentType
="test.User"
/>

????????????
<
return-type?
componentType
="test.User"
/>


????????
</
method
>

??

??????

????
</
mapping
>

</
mappings
>



services.xml? xFire发布文件
?

<?
xml?version
=
"
1.0
"
?encoding
=
"
UTF-8
"
?>



<
beans
>

<
service?xmlns
=
"
http://xfire.codehaus.org/config/1.0
"
>

<
name
>
HelloService
</
name
>

<
namespace
>
http:
//
test/HelloService</namespace>

<
serviceClass
>
test.IHelloService
</
serviceClass
>

<
implementationClass
>
test.HelloServiceImpl
</
implementationClass
>


</
service
>

</
beans
>
?
部署到tomcat中,在浏览器中运行http://localhost:8080/XFire/services/HelloService?wsdl
如果部署正确,讲出现XFire生成的wsdl文件
?
把IHelloService.java,IHelloService.aegis.xm,User.java打包成jar
下面,我们编写消费WS的客户端
?
新建一个java工程,把服务端的jar放到classpath中,当然,服务和客户端都要有XFire的类库
编写代码
?

package
?test;

import
?java.net.MalformedURLException;


import
?org.codehaus.xfire.client.XFireProxyFactory;

import
?org.codehaus.xfire.service.Service;

import
?org.codehaus.xfire.service.binding.ObjectServiceFactory;


import
?test.IHelloService;

import
?test.User;







public
?
class
?Client?
...
{



????/**?*//**

?????*?@param?args

?????*/


????public?static?void?main(String[]?args)?...{

????????User?user=new?User("2","2");

????????String?serviceURL="http://localhost:8080/XFire/services/HelloService";

????????Service?serviceModel?=?new?ObjectServiceFactory().create(IHelloService.class,null,"http://test/HelloService",null);

????????XFireProxyFactory?serviceFactory?=?new?XFireProxyFactory();

????????IHelloService?service?=?null;????


?????????try?...{

????????????service?=?(IHelloService)?serviceFactory.create(serviceModel,?serviceURL);

?????????

????????????user=service.getUser(user);

????????????

????????????System.out.println(user.getUsername()+"?-?"+user.getPassword());


?????????}?catch?(MalformedURLException?e)?...{


????????????e.printStackTrace();

????????}

????}


}

?
在tomca安装目录下的bin中启动tomcat(注意不要使用eclipse环境中的启动插件,否则运行客户端时候会自动关掉服务)
?
运行结果:
new name - new password
真是我们想要的结果