当前位置: 代码迷 >> Web前端 >> axis兑现webservice 返回对象和数组
  详细解决方案

axis兑现webservice 返回对象和数组

热度:134   发布时间:2012-09-05 15:19:34.0
axis实现webservice 返回对象和数组
axis1传递简单对象,对象内只有基本类型,如:String,int等

1.创建一个javaBean,类名为User。

package com.devtek;

public class User {

    private String name="llc";
    private int age = 25;

    public String toString() {
       
        return "name " + name + " age " + age ;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


2. 服务端编写。

package com.devtek;

public class ServiceServer {

// 参数和返回值不包含对象
    public String getName(String name) {
       if (name == null) {
        name = "";
       }
       return "你好" + name + ",欢迎来到Web服务的世界!";
    }
    public String getUserName(User user) {
        return user.getName();
    }

    public User getUser(String name, String password) {
        return new User();
    }
   
    //  返回简单的对象(只包含基本的类型)
    public User getUser(User user) {
        System.out.println(user.getName());
        return user;
    }
}

3. 发布服务,在server-confing.wsdd文件中进行配置。

<?xml version="1.0" encoding="UTF-8" ?>
<deployment name="defaultClientConfig"
xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:handler="http://xml.apache.org/axis/wsdd/providers/handler"
xmlns="http://xml.apache.org/axis/wsdd/">
<globalConfiguration name="defaultClientConfig">
   <requestFlow name="RequestFlow1" type="">
    <handler name="Handler1"
     type="java:org.apache.axis.handlers.JWSHandler">
     <parameter name="scope" value="session" />
    </handler>
    <handler name="Handler2"
     type="java:org.apache.axis.handlers.JWSHandler">
     <parameter name="scope" value="request" />
     <parameter name="extension" value=".jwr" />
    </handler>
   </requestFlow>
</globalConfiguration>
<handler name="URLMapper"
   type="java:org.apache.axis.handlers.http.URLMapper" />
<handler name="LocalResponder"
   type="java:org.apache.axis.transport.local.LocalResponder" />
<handler name="Authenticate"
   type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
<transport name="http" type="">
   <requestFlow name="RequestFlow1" type="">
    <handler name="Handler1" type="URLMapper" />
    <handler name="Handler2"
     type="java:org.apache.axis.handlers.http.HTTPAuthHandler" />
   </requestFlow>
</transport>
<transport name="local" type="">
   <responseFlow name="ResponseFlow1" type="">
    <handler name="Handler1" type="LocalResponder" />
   </responseFlow>
</transport>
<!--这里配置了一个Web Service,如果有多个Web Service,就按这种格式在下面增加即可-->
<service name="User" provider="java:RPC">
<!-- 作用域 -->
   <parameter name="scope" value="Request" />
   <!-- 发布的webservice类名 -->
   <parameter name="className" value="com.devtek.ServiceServer" />
   <!-- 发布webservice方法,value="*" '*'代表所有, 如果不想发布所有的方法,可以在
   value 中,每个方法用空格分开,如发布两个方法:value="getUserName getUser"
   -->
   <parameter name="allowedMethods" value="*" />
   <!-- 对象映射,一对象为参数或返回值 -->
      <beanMapping languageSpecificType="java:com.devtek.User"
      qname="ns1:User" xmlns:ns1="com.devtek" />
  <!-- 类型映射,将对象进行序列化(out)和反序列化(in) -->
    <typeMapping languageSpecificType="java:com.devtek.User"
   qname="ns1:User" xmlns:ns1="com.devtek"
   deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
   serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"/>
   <namespace>com.devtek</namespace>
</service>
</deployment>


4. 客户端调用。

package com.devtek;

import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;

public class Client {

    public static void main(String[] args) {
        try {
         String endpoint = "http://127.0.0.1:8089/axis1/webservices/User?wsdl";

         Service service = new Service();
         Call call = null;
         QName qn = new QName("http://127.0.0.1:8089/axis1/webservices/User",
         "getUser");
         call = (Call) service.createCall();
         // 注册序列化和反序列化类
         call.registerTypeMapping(User.class, qn,
                 new BeanSerializerFactory(User.class, qn),
                 new BeanDeserializerFactory(User.class, qn));
         // 设置返回类型
         call.setReturnType(qn, User.class);
         call.setOperationName(qn);
         call.setTargetEndpointAddress(new java.net.URL(endpoint));
         call.addParameter("user", qn, javax.xml.rpc.ParameterMode.IN);

         User user = new User();
         User ret = (User) call.invoke(new Object[] { user });
         System.out.println("return value is " + ret);
        } catch (Exception ex) {
         ex.printStackTrace();
        }
     }
}

1. 在服务类serviceServer中增加一个方法:

    public User[] getUserList(User[] user) {   
       return user;
    }

2. 在server-config.wsdd的<service>中增加一个<arrayMapping>标签,标签内配置自定义对象数组。

   <!-- 配置自定义对象数组type,将对象数组进行序列化和反序列化 -->
   <arrayMapping languageSpecificType="java:com.devtek.User[]"
   qname="ns1:User" xmlns:ns1="com.devtek"
   deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
   serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"/>

3. 客户端调用。

public static void main(String[] args) {

    User[] ret = null;
        try {
            String endpoint = "http://127.0.0.1:8089/axis1/webservices/User?wsdl";

            Service service = new Service();
            Call call = null;
            QName qn = new QName("http://127.0.0.1:8089/axis1/webservices/User",
            "getUserList");
            call = (Call) service.createCall();
            // 注册序列化和反序列化类
            call.registerTypeMapping(User.class, qn,
                    new BeanSerializerFactory(User.class, qn),
                    new BeanDeserializerFactory(User.class, qn));
           
            // 设置返回类型
            call.setReturnType(qn, User[].class);
            // 设置方法
            call.setOperationName(qn);
            call.setTargetEndpointAddress(new java.net.URL(endpoint));
            call.addParameter("user", qn, javax.xml.rpc.ParameterMode.IN);

            User[] user = new User[]{new User(),new User()};
            ret = (User[]) call.invoke(new Object[] { user });
            System.out.println("return value is " + (User)ret[1]);
           } catch (Exception ex) {
            ex.printStackTrace();
           }
           return ret;
}
  相关解决方案