• Web Service学习之六:CXF解决无法处理的数据类型


      CXF不能够处理像Map复杂的数据类型,需要单独转换处理。

    总体思路:创建一个转换器和一个对应的可以处理的数据结构类型,将不能处理的类型转换成可以处理的类型:

    步骤:

    一、创建一个可以处理的类型 举例:要转换Map<String,User>

    package ws;
    
    import java.util.List;
    
    public class StringUser 
    {
        public static class Entry
        {
            private String key;
            private User value;
            public String getKey() {
                return key;
            }
            public void setKey(String key) {
                this.key = key;
            }
            public User getValue() {
                return value;
            }
            public void setValue(User value) {
                this.value = value;
            }
        }
        private List<Entry> values;
        public List<Entry> getValues() {
            return values;
        }
        public void setValues(List<Entry> values) {
            this.values = values;
        }
        
        
    }

    二、创建一个转换器,需要继承抽象类XmlAdapter<ValueType,BoundType>,其中ValueType是可以处理的类型  BoundType是不能处理的类型

    package ws;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    import ws.StringUser.Entry;
    
    /**
     * 该转换器负责将StringUser 与 Map<String, User>进行转换
     * 其中第一个参数StringUser是CXF可以处理的类型
     * 第二个参数 Map<String, User> 是CXF不能处理的类型*/
    public class FKXmlAdapter extends XmlAdapter<StringUser, Map<String, User>> 
    {
    
        /**
         * 将StringUser 转换成  Map<String, User>
         */
        @Override
        public Map<String, User> unmarshal(StringUser v) throws Exception 
        {
            Map<String, User> map = new HashMap<String, User>();
            for (Entry u : v.getValues())
            {
                map.put(u.getKey(), u.getValue());
            }
            return map;
        }
    
        /**
         * 将 Map<String, User> 转换成 StringUser 
         */
        @Override
        public StringUser marshal(Map<String, User> v) throws Exception
        {
            StringUser u = new StringUser();
            List<Entry> list = new ArrayList<Entry>();
            
            for (String key : v.keySet())
            {
                Entry e = new Entry();
                e.setKey(key);
                e.setValue(v.get(key));
                list.add(e);
            }
            
            u.setValues(list);
            return u;
        }
    
    }

    三、Web Service中定义该方法  需要使用注解 @XmlJavaTypeAdapter(value=FKXmlAdapter.class)注明返回值对应的处理转换器

    @WebMethod(operationName="getSecUsers")
    @WebResult(name="returninfo")
    public @XmlJavaTypeAdapter(value=FKXmlAdapter.class) Map<String, User> getSecUsers();

    四、测试如下 查看WSDL文档  返回数据类型均为可解析的类型

    服务端实现类:

    package ws.impl;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.jws.WebService;
    
    import ws.HelloWordI;
    import ws.User;
    
    /**
     * 类说明
     * @author wangjunyu
     * @createDate 2016-7-10 上午10:59:27
     * @version V1.0
     */
    @WebService(endpointInterface="ws.HelloWordI",serviceName="HelloWordImpl")
    public class HelloWordImpl implements HelloWordI 
    {
    
        public String sayHi(String name) 
        {
            return name+",你好,当前时间是:"+new Date();
        }
    
        public List<User> getUsers(User user) 
        {
            System.out.println("测试:"+user.getName());
            List<User> list = new ArrayList<User>();
            User u1 = new User();
            u1.setId("1");
            u1.setName("小明");
            list.add(u1);
            User u2 = new User();
            u2.setId("2");
            u2.setName("雪梅");
            list.add(u2);
            return list;
        }
    
        @Override
        public Map<String, User> getSecUsers() 
        {
            Map<String,User> map = new HashMap<String,User>();
            User u1 = new User();
            u1.setId("1");
            u1.setName("小明");
            map.put("一", u1);
            
            User u2 = new User();
            u2.setId("2");
            u2.setName("小红");
            map.put("二", u2);
            
            return map;
        }
        
    }
    package ws;
    
    import javax.xml.ws.Endpoint;
    
    import ws.impl.HelloWordImpl;
    
    
    public class ServerMain {
    
        public static void main(String[] args) 
        {
            
            HelloWordI hw = new HelloWordImpl();
            Endpoint.publish("http://192.168.0.104/test", hw);
            System.out.println("WebService 暴露成功!");
        }
    
    }

    客户端打印:

    package ws;
    
    import java.util.List;
    
    import ws.impl.HelloWordImpl;
    
    public class ClientMain {
    
        /**
         * @param args
         */
        public static void main(String[] args) 
        {
    
            StringUser u = hw.getSecUsers();
            System.out.println(u.getValues().get(0).getValue().getName());
            System.out.println(u.getValues().get(1).getValue().getName());
        }
    
    }
  • 相关阅读:
    Hibernate中session的产生的方式
    Hibernate 多对多关联Demo
    Hibernate 一对多双向关联Demo
    Beta(0/7)
    获得小黄衫感想(2)
    软工实践作业(十)
    成员交换情况
    Alpha事后诸葛亮
    Alpha冲刺总结
    Alpha(10/10)
  • 原文地址:https://www.cnblogs.com/cac2020/p/5971503.html
Copyright © 2020-2023  润新知