在web service间传递java bean

来源:互联网 发布:java javascript 编辑:程序博客网 时间:2024/06/05 09:35

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);

以上提供了一种编写的方式,这里只是一种。


0 0
原创粉丝点击