web service的调用返回值都是基本的数据类型,那么对于java这种具有很强的对象封装的语言,怎么来支持各种自定义的java类型的对象处理呢?
在java ee 规范中,我们是推荐使用java类的序列化(即让类实现Serializable这个接口)的方式,这个在有些情况下容易出现乱码的问题。
1、返回单个对象的web service的编写
---1、服务器端的编写
--------1、写一个自定义的java类,这个java类就是在 web service中需要传递的对象
public class Order implements Serializable{
private String id;
private String name;
set get Method...
}
---------2、对应于上面这个自定义类的服务类
public class OrderService {
public Order returnOrder(Order order) {
Order newOrder = new Order();//类似临时对象
//编写一些业务逻辑
if(order.getId().equals("1")) {
newOrder.setName("Jacky");
} else {
newOrder.setName("Tom");
}
return newOrder;
}
----------3、将他们编译成class或者jar包,以便于后续的拷贝与部署;
----------4、将编译好的class文件(或者jar包)拷贝到axis\web-inf\classes的路径下;
----------5、修改server-config.wsdd配置文件,添加相应的服务配置参数;
<service name="OrderService" provider="java:RPC">
<parameter name="className" value="com.webservice.wsdd.HelloWSDD"/> <!--这里可以使用通配符-->
<parameter name="allowedMethods" value="returnOrder"/>
<parameter name="scope" value="request/session/application"/>
</service>
但是上面的配置并没有完成,因为我们在服务的返回值当中使用了自定义的java bean对象,这个时候我们必须要在我们的配置文件中来加以声明:
---------6、将自定义的java类的类型,在webservice的配置文件中,进行描述
<service name="OrderService" provider="java:RPC">
<parameter name="className" value="anni.OrderService"/> <!--这里可以使用通配符-->
<parameter name="allowedMethods" value="returnOrder"/>
<parameter name="scope" value="request/session/application"/>
<beanMapping languageSpecificType="java:anni.Order" qname="nsl:Order" xmlns:nsl="BeanService" /> <!--这两个地方可以改动,其他地方固定的-->
<!--如果在类中使用内部类,我们尽量使用静态内部类,因为它支持序列化,-->
<!--如果在我们的自定义类的内部有对于另外一个自定义类的依赖,那么这个时候我们还需要在我们的service服务中在配置一个beanMapping的对应配置节点-->
</service>
----------7、编写测试客户端,首先在我们的客户端一定要有我们在服务器端自定义的类的class或者jar包,也就是说要引用自定义的jar包啦。String url = "http://localhost:8080/axis/services/OrderService";
Service service = new Service();
Call call = service.createCall();
//这里注册javaBean, 注意:和server-config.wsdd编写的内容一致
QName qn = new QName("urn:BeanService", "Order");
call.registerTypeMapping(Order.class, qn , new BeanSerializerFactory(Order.class, qn), new BeanDeserializerFactory(Order.class, qn);
//创建调用
call.setTargetEndpointAddress(new URL(url));
//调用服务器的方法
call.setOperationName(new QName("order", "returnOrder"));
//设定传入的参数
call.addParameter("arg1", qn, parameterMode.IN);
//设置返回的类型
call.setReturnType(qn, Order.class);
//接受结果
Order result = call.invoke(new Object[]{order});
System.out.println("the response is "+result);
以上提供了一种编写的方式,这里只是一种。