精华内容
下载资源
问答
  • 自己写的一个接口,返回类型是LinkedHashMap,但是webservice会自动转换成HashMap。各位大侠,这药怎么处理
  •  在昨天研究了发布CXF发布webservice之后想着将以前的项目发布webservice接口,可是怎么也发布不起来,服务启动失败,原来是自己的接口有返回值类型是Map。  研究了一番之后,发现:  webService可以处理Java ...

      

      在昨天研究了发布CXF发布webservice之后想着将以前的项目发布webservice接口,可是怎么也发布不起来,服务启动失败,原来是自己的接口有返回值类型是Map。

      研究了一番之后,发现:

        webService可以处理Java 数据类型、JavaBean、List等,但是却不能处理Map数据类型,也不能返回List<Map>类型数据。于是做了两个研究:

     

    1.发布返回值类型是Map<String,Object>类型接口

      在发布的时候竟然神奇般的发布成功了,接口如下:

    接口:

    package cn.qlq.service;
    
    import java.sql.SQLException;
    import java.util.Map;
    
    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    import cn.qlq.adapter.MapAdapter;
    import cn.qlq.domain.User;
    
    @WebService
    public interface UserService {
        /**
         * 保存用户
         * 
         * @param user
         * @return
         * @throws SQLException
         */
        public int saveUser(User user) throws SQLException;
    
        /**
         * 根据userId获取user
         * 
         * @param userId
         * @return
         */
        @WebMethod
        public User getUserById(int userId);
        
        /**
         * 根据userId获取userMap
         * 
         * @param userId
         * @return
         */
        public Map<String,Object> getUserMapById(int id);
    }

     

    实现类:

    package cn.qlq.service.impl;
    
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    
    import javax.jws.WebService;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import cn.qlq.dao.UserDao;
    import cn.qlq.domain.User;
    import cn.qlq.service.UserService;
    
    @Service
    @WebService(targetNamespace = "http://service.qlq.cn")
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserDao userDao;
    
        @Override
        public int saveUser(User user) throws SQLException {
            System.out.println("----------------保存user----------");
            return 0;
        }
    
        @Override
        public User getUserById(int userId) {
            System.out.println("----------------获取user----------" + userId);
            return userDao.getUserById(userId);
        }
    
        @Override
        public Map<String, Object> getUserMapById(int id) {
            return userDao.getUserMapById(id);
        }
    
    }

     

     

    发布webservice还是上一篇的方式,启动成功之后采用动态代理方式访问:

    import javax.xml.namespace.QName;
    
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    
    public class TestWS {
    
        public static void main(String[] args) throws Exception {
    
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    
            org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost/CXFTest/WS/userws?wsdl"); // url为调用webService的wsdl地址
    
            QName name = new QName("http://service.qlq.cn/", "getUserMapById");// namespace是命名空间,methodName是方法名
    
            Object[] objects;
            try {
                objects = client.invoke(name,5);// 第一个参数是上面的QName,第二个开始为参数,可变数组
                System.out.println(objects[0].toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

     

    结果是正常的,如下:(还是map类型)

      cn.qlq.service.GetUserMapByIdResponse$Return@273aa934

     

     

    如果报错,我们可以加一个转换器,如下:

    package cn.qlq.service;
    
    import java.sql.SQLException;
    import java.util.Map;
    
    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    import cn.qlq.adapter.MapAdapter;
    import cn.qlq.domain.User;
    
    @WebService
    public interface UserService {
        /**
         * 保存用户
         * 
         * @param user
         * @return
         * @throws SQLException
         */
        public int saveUser(User user) throws SQLException;
    
        /**
         * 根据userId获取user
         * 
         * @param userId
         * @return
         */
        @WebMethod
        public User getUserById(int userId);
        
        /**
         * 根据userId获取userMap
         * 
         * @param userId
         * @return
         */
        @XmlJavaTypeAdapter(MapAdapter.class)
        public Map<String,Object> getUserMapById(int id);
    }

     

    编写转换器:

      这里参数需要一个实现了XmlAdapter类的适配器类;

      这里的话XmlAdapter要加两个参数,XmlAdapter<ValueType,BoundType> 

      ValueType是cxf能接收的类型,BoundType是cxf不能接受的类型;

    package cn.qlq.adapter;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    import cn.qlq.domain.User;
    
    public class MapAdapter extends XmlAdapter<User,Map<String, Object>> {
    
        @Override
        public Map<String, Object> unmarshal(User v) throws Exception {
            Map result = new HashMap();
            result.put("username", v.getUsername());
            result.put("password", v.getPassword());
            return result;
        }
    
        @Override
        public User marshal(Map<String, Object> v) throws Exception {
            User u = new User();
            u.setUsername((String) v.get("username"));
            u.setPassword((String) v.get("password"));
            return u;
        }
    }

     

     

    测试代码还是上面代码,结果:(被转成User对象)

    cn.qlq.service.User@530db33e

     

    另外附一通用的map转换器:

    package cn.qlq.adapter;
    
    
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    
    public class MapAdapter extends XmlAdapter<MapEntity[], Map> {
        
        @Override
        public MapEntity[] marshal(Map map) throws Exception {
            // TODO Auto-generated method stub
            MapEntity[] list = new MapEntity[map.size()];
            Set keyset = map.keySet();
            int index =0;
            for(Iterator itor=keyset.iterator();itor.hasNext();){
                MapEntity item = new MapEntity();
                item.key = itor.next();
                item.value = map.get(item.key);
                list[index++] = item;            
            }
            return list;
        }
    
        @Override
        public Map unmarshal(MapEntity[] list) throws Exception {
            // TODO Auto-generated method stub
            Map map = new HashMap();
            for(int i=0;i<list.length;i++){
                MapEntity item = list[i];
                map.put(item.key, item.value);
            }
            
            return map;
            
        }
    
    }
    
    class MapEntity{
        public Object key;
        public Object value;
    }

     

     

    2.发布返回值类型是List<Map<String,Object>>类型接口

    在上面service增加一个接口:

    package cn.qlq.service;
    
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    
    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    import cn.qlq.adapter.MapAdapter;
    import cn.qlq.adapter.UserMapAdapter;
    import cn.qlq.domain.User;
    
    @WebService
    public interface UserService {
        /**
         * 保存用户
         * 
         * @param user
         * @return
         * @throws SQLException
         */
        public int saveUser(User user) throws SQLException;
    
        /**
         * 根据userId获取user
         * 
         * @param userId
         * @return
         */
        @WebMethod
        public User getUserById(int userId);
    
        /**
         * 模拟获取所有的用户,一个map代表一个用户
         * 
         * @return
         */public List<Map<String, Object>> getAllUsers();
    
        /**
         * 根据userId获取userMap
         * 
         * @param userId
         * @return
         */
        @XmlJavaTypeAdapter(MapAdapter.class)
        public Map<String, Object> getUserMapById(int id);
    }

     

    实现类:

    package cn.qlq.service.impl;
    
    import java.sql.SQLException;
    import java.util.List;
    import java.util.Map;
    
    import javax.jws.WebService;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import cn.qlq.dao.UserDao;
    import cn.qlq.domain.User;
    import cn.qlq.service.UserService;
    
    @Service
    @WebService(targetNamespace = "http://service.qlq.cn")
    public class UserServiceImpl implements UserService {
        @Autowired
        private UserDao userDao;
    
        @Override
        public int saveUser(User user) throws SQLException {
            System.out.println("----------------保存user----------");
            return 0;
        }
    
        @Override
        public User getUserById(int userId) {
            System.out.println("----------------获取user----------" + userId);
            return userDao.getUserById(userId);
        }
    
        @Override
        public List<Map<String, Object>> getAllUsers() {
            return userDao.getAllUsers();
        }
    
        @Override
        public Map<String, Object> getUserMapById(int id) {
            return userDao.getUserMapById(id);
        }
    
    }

     

     

    直接发布报错如下:

    严重: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userWS': Invocation of init method failed; nested exception is javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1422)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:518)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
        at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:282)
        at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:204)
        at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5118)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5634)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
    Caused by: javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException
        at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:369)
        at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:251)
        at org.apache.cxf.jaxws.EndpointImpl.publish(EndpointImpl.java:537)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1546)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1487)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1419)
        ... 21 more
    Caused by: org.apache.cxf.service.factory.ServiceConstructionException
        at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:332)
        at org.apache.cxf.service.factory.AbstractServiceFactoryBean.initializeDataBindings(AbstractServiceFactoryBean.java:86)
        at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromClass(ReflectionServiceFactoryBean.java:478)
        at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.buildServiceFromClass(JaxWsServiceFactoryBean.java:690)
        at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:540)
        at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:252)
        at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:205)
        at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:102)
        at org.apache.cxf.frontend.ServerFactoryBean.create(ServerFactoryBean.java:159)
        at org.apache.cxf.jaxws.JaxWsServerFactoryBean.create(JaxWsServerFactoryBean.java:211)
        at org.apache.cxf.jaxws.EndpointImpl.getServer(EndpointImpl.java:454)
        at org.apache.cxf.jaxws.EndpointImpl.doPublish(EndpointImpl.java:334)
        ... 30 more
    Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
    java.util.Map is an interface, and JAXB can't handle interfaces.
        this problem is related to the following location:
            at java.util.Map
            at private java.util.Map cn.qlq.service.jaxws_asm.GetAllUsersResponse._return
            at cn.qlq.service.jaxws_asm.GetAllUsersResponse
    
        at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:442)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:274)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:125)
        at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1127)
        at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
        at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
        at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
        at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
        at org.apache.cxf.common.jaxb.JAXBContextCache.createContext(JAXBContextCache.java:278)
        at org.apache.cxf.common.jaxb.JAXBContextCache.getCachedContextAndSchemas(JAXBContextCache.java:172)
        at org.apache.cxf.jaxb.JAXBDataBinding.createJAXBContextAndSchemas(JAXBDataBinding.java:464)
        at org.apache.cxf.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:330)
        ... 41 more

     

     

     

    解决办法也是编写转换器并且在接口的抽象方法上声明转换器或者用一个bean接收Map中的entry

    (1)第一种解决办法:不知道什么原因我直接写转换器转List<Map>老是报错,最后没办法了就将List<Map>放进map中再进行转换器转换,如下:(需要转换器)

    dao层模拟从数据看查询的直接是List<Map>

        @Override
        public List<Map<String, Object>> getAllUsers() {
            //模拟从数据库取数据
            List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
            for(int i=0;i<3;i++){
                Map map = new HashMap();
                map.put("username", i);
                map.put("password", i);
                result.add((HashMap<String, Object>) map);
            }
            return result;
        }

     

     

    service接口方法:

        @XmlJavaTypeAdapter(MapAdapter3.class)
        public Map<String,List<Map<String, Object>>> getAllUsers();

     

     

    service实现类实现方法:(就是将List<Map>又装到一个Map中了)

        @Override
        public Map<String, List<Map<String, Object>>> getAllUsers() {
            Map result = new HashMap();
            List<Map<String, Object>> allUsers = userDao.getAllUsers();
            result.put("allUsers", allUsers);
            return result;
        }

     

    转换器:

    package cn.qlq.adapter;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    import cn.qlq.domain.User;
    
    @SuppressWarnings("all")
    public class MapAdapter3 extends XmlAdapter<User[], Map<String, List<Map<String, Object>>>> {
    
        @Override
        public Map<String, List<Map<String, Object>>> unmarshal(User[] v) throws Exception {
            Map result = new HashMap();
            List<Map> list = new ArrayList();
            for (User u : v) {
                Map map = new HashMap();
                map.put("username", u.getUsername());
                map.put("password", u.getPassword());
                list.add(map);
            }
    
            result.put("allUsers", list);
            return result;
        }
    
        @Override
        public User[] marshal(Map<String, List<Map<String, Object>>> v) throws Exception {
            int length = v.size();
            User u[] = new User[length];
            List<Map<String, Object>> userMap = v.get("allUsers");
            for (int i = 0; i < length; i++) {
                Map m = userMap.get(i);
                User user = new User();
                user.setPassword(m.get("username").toString());
                user.setPassword(m.get("password").toString());
                u[i] = user;
            }
            return u;
        }
    
    }

     

     

    测试代码:

    import javax.xml.namespace.QName;
    
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    
    public class TestWS {
    
        public static void main(String[] args) throws Exception {
    
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    
            org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost/CXFTest/WS/userws?wsdl"); // url为调用webService的wsdl地址
    
            QName name = new QName("http://service.qlq.cn/", "getAllUsers");// namespace是命名空间,methodName是方法名
    
            Object[] objects;
            try {
                objects = client.invoke(name);// 第一个参数是上面的QName,第二个开始为参数,可变数组
                System.out.println(objects[0].toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

     

     

    结果:

      cn.qlq.service.UserArray@7b17b8ad

     

    (2)第二种方法我们可以编写一个实体类接收Map,也就是map中的一个entry对应bean的一个属性,这样我们只用拿List<BeanName>替代List<Map>(不需要转换器====推荐这种方式)

    dao层还是上面的代码:

        @Override
        public List<Map<String, Object>> getAllUsers() {
            //模拟从数据库取数据
            List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
            for(int i=0;i<3;i++){
                Map map = new HashMap();
                map.put("username", i);
                map.put("password", i);
                result.add((HashMap<String, Object>) map);
            }
            return result;
        }

     

     

    比如上面每个map都有username和password,我们可以写一个实体:

    package cn.qlq.domain;
    
    public class User {
    
        private String username;
        private String password;
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getPassword() {
            return password;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        @Override
        public String toString() {
            return "User [username=" + username + ", password=" + password + "]";
        }
    }

     

     

    service方法:

        /**
         * 模拟获取所有的用户,一个map代表一个用户
         * 
         * @return
         */
        public List<User> getAllUsers();

     

     

    serviceImpl实现方法

        @Override
        public List<User> getAllUsers() {
            List<Map<String, Object>> allUsers = userDao.getAllUsers();
            List<User> users = new ArrayList();
            for (Map userMap : allUsers) {
                User u = new User();
                u.setUsername(userMap.get("username").toString());
                u.setPassword(userMap.get("password").toString());
                users.add(u);
            }
            return users;
        }

     

     

    测试代码:

    import javax.xml.namespace.QName;
    
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    
    public class TestWS {
    
        public static void main(String[] args) throws Exception {
    
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    
            org.apache.cxf.endpoint.Client client = dcf.createClient("http://localhost/CXFTest/WS/userws?wsdl"); // url为调用webService的wsdl地址
    
            QName name = new QName("http://service.qlq.cn/", "getAllUsers");// namespace是命名空间,methodName是方法名
    
            Object[] objects;
            try {
                objects = client.invoke(name);// 第一个参数是上面的QName,第二个开始为参数,可变数组
                System.out.println(objects[0].toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

     

     

    结果:

      [cn.qlq.service.User@1a89b61f, cn.qlq.service.User@4713bad5, cn.qlq.service.User@604f1a67]

     

    转载于:https://www.cnblogs.com/qlqwjy/p/9649615.html

    展开全文
  • Axis1.4调用.Net返回值为DataSet类型WebService接口 1.相关说明 2.Axis1.4下载及依赖 1.Axis1.4下载 1.非maven环境导入依赖的包 3.maven环境导入依赖的包 3.WebService服务接口地址 4.编写调用WebService服务的...

    1.相关说明

    • 首先要说的是:在多种语言共存的编程环境下,是不适合使用类似DataSet这种只属于特定语言的数据类型的,应该尽量使用多语言都支持的简单数据类型以及简单数据类型的数组进行跨平台之间的接口调用。
    • 但往往有些时候就会碰到这种返回值为Dataset类型的WebService接口,而且暴露服务接口的一方不愿意做改动,这时候难题就丢给调用方了,这里使用Java语言对.Net返回值为DataSet类型的WebService接口进行调用与数据解析。
    1. JDK版本:1.8.0_172
    2. axis版本:Axis1.4

    2.Axis1.4下载及依赖

    1.Axis1.4下载

    1. 官网:http://axis.apache.org/axis/
    2. 下载官网上的bin压缩文件:axis-bin_1.4.zip

    1.非maven环境导入依赖的包

    导入axis-bin_1.4.zip包下的lib目录下的所有jar包,如下图:
    在这里插入图片描述

    3.maven环境导入依赖的包

    在pom.xml中添加下面的依赖即可

    <!--Axis1.4 及其依赖 begin-->
            <!-- https://mvnrepository.com/artifact/org.apache.axis/axis -->
            <dependency>
                <groupId>org.apache.axis</groupId>
                <artifactId>axis</artifactId>
                <version>1.4</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/axis/axis-jaxrpc -->
            <dependency>
                <groupId>axis</groupId>
                <artifactId>axis-jaxrpc</artifactId>
                <version>1.4</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/axis/axis-ant -->
            <dependency>
                <groupId>axis</groupId>
                <artifactId>axis-ant</artifactId>
                <version>1.4</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/axis/axis-saaj -->
            <dependency>
                <groupId>axis</groupId>
                <artifactId>axis-saaj</artifactId>
                <version>1.4</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/wsdl4j/wsdl4j -->
            <dependency>
                <groupId>wsdl4j</groupId>
                <artifactId>wsdl4j</artifactId>
                <version>1.6.3</version>
            </dependency>
            <!-- https://mvnrepository.com/artifact/commons-discovery/commons-discovery -->
            <dependency>
                <groupId>commons-discovery</groupId>
                <artifactId>commons-discovery</artifactId>
                <version>0.5</version>
            </dependency>
            <!--Axis1.4 及其依赖 end-->
    		<!-- 引入dom4j 解析数据时用-->
     		<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
            <dependency>
                <groupId>org.dom4j</groupId>
                <artifactId>dom4j</artifactId>
                <version>2.1.1</version>
            </dependency>
    

    3.WebService服务接口地址

    • 这里使用一个网上找的一个使用.Net写的WebService接口作为参考实例进行解析
    1. WS接口地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
    2. 调用的方法:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getSupportDataSet
    3. 调用getSupportDataSet方法后,wsdl文档如下图:
      在这里插入图片描述

    4.编写调用WebService服务的方法及数据解析

    编写调用WebService服务的客户端java类,并打印结果,类名为:Axis1_Client

    package com.yuan;
    
    
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import org.apache.axis.encoding.XMLType;
    import org.apache.axis.message.MessageElement;
    import org.apache.axis.types.Schema;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.junit.Test;
    
    import javax.xml.namespace.QName;
    import java.net.URL;
    import java.util.Iterator;
    import java.util.List;
    
    /**
     * Created by IntelliJ IDEA.
     * User: jinshengyuan
     * Date: 2019-01-15
     * Time: 15:13
     * description:
     **/
    public class Axis1_Client {
        /**
         * 使用dom4j解析数据
         */
        @Test
        public void axisWSInvoke(){
            String dataSetDataStr = axisInvokeNetDataSetData();
            //System.out.println(dataSetDataStr);
            if(dataSetDataStr != null){
                try {
                    Document doc = DocumentHelper.parseText(dataSetDataStr);// 将字符串转为XML
                    Element root = doc.getRootElement();// 获取根节点
                    Iterator iterator =  root.elementIterator("Zone");//迭代节点
                    String id,zone;
                    while(iterator.hasNext()){
                      Element element = (Element) iterator.next();
                      id = element.elementTextTrim("ID");//取出Zone节点下的ID元素的值
                      zone = element.elementTextTrim("Zone");//取出Zone节点下的Zone元素的值
                        System.out.println("Id:"+id+"=============================Zone:"+zone);
                    }
                } catch (DocumentException e) {
                    e.printStackTrace();
                }
    
            }
        }
    
        /**
         * 调用.Net写的返回值为DataSet类型的WebService服务
         * @return
         */
        public String axisInvokeNetDataSetData(){
            Service service = new Service();
            String strXml = null;
            Call call = null;
            try {
                call = (Call) service.createCall();
                call.setTargetEndpointAddress(new URL("http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"));//WSURL,注意不要带?wsdl
                //调用方法方法前设置相关参数
                call.setOperationName(new QName("http://WebXml.com.cn/", "getSupportDataSet"));
                call.setReturnType(XMLType.XSD_SCHEMA);//返回类型,这里一定要传入 XMLType.XSD_SCHEMA 类型
                call.setUseSOAPAction(true);
                call.setSOAPActionURI("http://WebXml.com.cn/getSupportDataSet");//soapAction
                Object obj = call.invoke((Object[]) null);
                Schema schema = (Schema) obj;
                MessageElement[] messageElements = schema.get_any();
                List messageHead = messageElements[0].getChildren();//消息头,DataSet对象
                List messageBody = messageElements[1].getChildren();//消息体信息,DataSet对象,最终需要解析的数据
                if (messageBody.size() > 0) {
                    String head = messageHead.get(0).toString();//消息头,DataSet对象
                    String diffgr = messageBody.get(0).toString();//消息体的字符串形式
                    strXml = diffgr;
                    System.out.println("head:\n"+head);
                    System.out.println("diffgr:\n" + diffgr);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return strXml;
        }
    }
    
    1. 输出结果:
    Id:1=============================Zone:直辖市
    Id:2=============================Zone:特别行政区
    Id:3=============================Zone:黑龙江
    Id:4=============================Zone:吉林
    Id:5=============================Zone:辽宁
    Id:6=============================Zone:内蒙古
    Id:7=============================Zone:河北
    Id:8=============================Zone:河南
    Id:9=============================Zone:山东
    Id:10=============================Zone:山西
    Id:11=============================Zone:江苏
    Id:12=============================Zone:安徽
    Id:13=============================Zone:陕西
    Id:14=============================Zone:宁夏
    Id:15=============================Zone:甘肃
    Id:16=============================Zone:青海
    Id:17=============================Zone:湖北
    Id:18=============================Zone:湖南
    Id:19=============================Zone:浙江
    Id:20=============================Zone:江西
    Id:21=============================Zone:福建
    Id:22=============================Zone:贵州
    Id:23=============================Zone:四川
    Id:24=============================Zone:广东
    Id:25=============================Zone:广西
    Id:26=============================Zone:云南
    Id:27=============================Zone:海南
    Id:28=============================Zone:新疆
    Id:29=============================Zone:西藏
    Id:30=============================Zone:台湾
    Id:31=============================Zone:亚洲
    Id:32=============================Zone:欧洲
    Id:33=============================Zone:非洲
    Id:34=============================Zone:北美洲
    Id:35=============================Zone:南美洲
    Id:36=============================Zone:大洋洲
    
    展开全文
  • 1、用SoapUI测试webservice接口,传入参数是xml格式时。xml格式需要将xml的外围增加2、但是用python去做webservice测试,调用函数去传参时,直接将xml作为字符串的格式传入即可。其中,webservice请求的返回值类型是...

    1、用SoapUI测试webservice接口,传入参数是xml格式时。xml格式需要将xml的外围增加

    2、但是用python去做webservice测试,调用函数去传参时,直接将xml作为字符串的格式传入即可。

    其中,webservice请求的返回值类型是:,

    需要用json.loads(escape(result))转成字典的格式:。去引用

    具体展示如下:

    注意SoapUI:xml的格式需要将xml外围增加

    from suds.client import Client

    import json

    from xml.sax.saxutils import escape

    class WebserviceSuds():

    def webservice_suds(self,url,msg,operetions):

    '''url:webservice的wsdl请求地址

    msg:传入的参数 注:直接把xml参数当成一个字符串来传递就OK了

    operetions:接口操作方式'''

    # 创建一个webservice对象,来调用webservice里面的各类接口

    c=Client(url)

    # print(c)

    # .service去调用接口函数方法method, 注:直接把xml参数当成一个字符串来传递就OK了 # 注意SoapUI:xml的格式需要将xml外围增加

    # 注册接口、查询接口、查询调阅接口

    if operetions=='register':

    result=c.service.register(msg)

    elif operetions=='query':

    result=c.service.query(msg)

    else:

    result=c.service.querySubscribe(msg)

    # escape转换成字符类型,json。loads()转成字典

    result = json.loads(escape(result))

    return result

    #factory,去查看参数情况

    # register=c.factory.create("register")

    # print(register)

    webservice接口的返回分析:

    传入参数为:xml

    xml.sax.saxutils.escape.

    xml格式转化字符串,再用json.loads()转化成字典

    from xml.sax.saxutils import escape

    import json

    # 转换成字符串类型

    print(type(escape(res)))

    # 转换成字典类型

    create_response = json.loads(escape(res))

    print(create_response)

    print(type(create_response))

    使用soapUI5&period;3&period;0调试webservice接口(参数为XML格式)

    最近项目中经常要调试webservice接口,从朋友处了解到他们经常使用SoapUI,因此学习一下这个工具的使用,为避免遗忘,特地记录下来,分享分享... 下载 #####首先,下载SoapUI,我下 ...

    day11 python学习 函数的建立,返回值,参数

    函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算,如:发送邮件.计算出 [11,22,38,888,2]中的最大数等 ...

    python使用threading获取线程函数返回值的实现方法

    python使用threading获取线程函数返回值的实现方法 这篇文章主要介绍了python使用threading获取线程函数返回值的实现方法,需要的朋友可以参考下 threading用于提供线程相 ...

    Python基本语法&lowbar;函数&lowbar;返回值

    目录 目录 前言 函数的返回值 在函数中Return和Print的区别 函数中的文档 前言 函数的返回值是函数重要的组成部分.函数的根本在于实现程序的部分功能,所以很多时候我们需要将函数执行后的结果返 ...

    webservice接口测试wsdl

    http和webservice接口测试有什么区别? webservice的基础组成是http+xml 三要素:soap传输协议,uddi,wsdl(webservice描述语言xml格式) 优点:跨平 ...

    返回参数去掉xml格式,以纯json格式返回(转)

    Json 格式显示public static void Register(HttpConfiguration config) { //设置不以xml格式返回 config.Fo ...

    python中函数的定义、返回值以及参数的简要介绍

    一. 1.函数 定义:def关键字开头,空格之后接函数名称和圆括号(),后面紧跟‘:”. 函数是对功能的封装 语法: def 函数名(形参列表): 函数体(代码块,return) 调用: 函数名(实参 ...

    python操作mysql数据-执行语句返回值直接返回字典类型

    fetchall()将结果放在二维数组里面,每一行的结果在元组里面 import pymysql def export(table_name): conn =pymysql.connect(host ...

    Python&plus;request 登录接口reponse的返回值token跨py文件的传递《二》

    主要使用场景: 一般我们在进行接口测试时,依赖登录接口后reponse中的某些返回值,因此需要将login接口单独写一个py文件,另外的py文件均可调用login的reponse返回值使用.共用登录接 ...

    随机推荐

    【poj1733】 Parity game

    http://poj.org/problem?id=1733 (题目链接) 题意 一个由0,1组成的序列,每次给出一段区间的奇偶,问哪一条信息不合法. Solution 并查集. 题目中序列的长度有很 ...

    IntelliJ和tomcat中的目录结构

    IntelliJ和tomcat中的目录结构   IntelliJ的官网帮助中心:http://www.jetbrains.com/idea/webhelp/getting-help.html   pr ...

    &lbrack;SAP ABAP开发技术总结&rsqb;字符串处理函数、正则表达式

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

    jboss5优化

    1.调整JVM在bin.bat或bin/run.cfg文件里. -Xms设置堆的最小值:-Xmx设置堆的最大值:-XX:Newsize= 设置年轻代的最小值:-XX:MaxNewsize=设置年轻代的 ...

    kbengine FAQ(3)

    官方FAQ 下面是我遇到的一些问题: 1.服务端   "strtof" 未定义的标示符 对于我这个c++入门级都不算的新手,这个错误很挠头,这个错误是由于vc++版本问题,新版的语 ...

    link&sol;Extended dependency 无法显示连接

    把矩形控件先去掉,然后就能看到表与表之间的 link/Extended dependency 连线了.

    java算法03 - 常用的8种排序算法

    Java常用的八种排序算法: 插入排序 - 直接插入排序 每次将待排序的记录按照关键字的大小,插入到前面已经排好序的记录的适当位置.直到全部记录插入完成. 代码实现 /** * 直接插入排序 O(n^ ...

    PHP之PSR

    PHP的PSR (PSR 称为PHP Standard Recommendations) PSR参考网址:http://www.php-fig.org/psr 在PHP中,有5个编码标准分类: ①.P ...

    &lbrack;Python&rsqb; 正确复制列表的方法

    new = old[:] Python老鸟都知道以上代码是什么意思.它复制列表old到new.它对于新手来说是种困惑而且应该避免使用这种方法.不幸的是[:]标记法被广泛使用,可能是Python程序员不 ...

    HTML&vert;CSS总结与补充

    知识内容: 1.HTML总结 2.CSS总结 一.HTML总结 详细内容见:http://www.cnblogs.com/wyb666/p/8733699.html 1.HTML介绍及前端入门 (1) ...

    展开全文
  • 1、用SoapUI测试webservice接口,传入参数是xml格式时。xml格式需要将xml的外围增加xml]]>2、但是用python去做webservice测试,调用函数去传参时,直接将xml作为字符串的格式传入即可。其中,webservice请求的...

    1、用SoapUI测试webservice接口,传入参数是xml格式时。xml格式需要将xml的外围增加xml]]>

    2、但是用python去做webservice测试,调用函数去传参时,直接将xml作为字符串的格式传入即可。

    其中,webservice请求的返回值类型是:,

    需要用json.loads(escape(result))转成字典的格式:。去引用

    具体展示如下:

    c5f9c794c38fa03199179ea3b5ba74a0.png

    注意SoapUI:xml的格式需要将xml外围增加

    from suds.client importClientimportjsonfrom xml.sax.saxutils importescapeclassWebserviceSuds():defwebservice_suds(self,url,msg,operetions):'''url:webservice的wsdl请求地址

    msg:传入的参数 注:直接把xml参数当成一个字符串来传递就OK了

    operetions:接口操作方式'''

    #创建一个webservice对象,来调用webservice里面的各类接口

    c=Client(url)#print(c)

    #.service去调用接口函数方法method, 注:直接把xml参数当成一个字符串来传递就OK了 # 注意SoapUI:xml的格式需要将xml外围增加

    #注册接口、查询接口、查询调阅接口

    if operetions=='register':

    result=c.service.register(msg)elif operetions=='query':

    result=c.service.query(msg)else:

    result=c.service.querySubscribe(msg)#escape转换成字符类型,json。loads()转成字典

    result =json.loads(escape(result))returnresult#factory,去查看参数情况

    #register=c.factory.create("register")

    #print(register)

    webservice接口的返回分析:

    https://www.cnblogs.com/xueli/p/6145211.html(webservie返回接口信息,详解)

    https://www.cnblogs.com/nottobe/p/5718823.html

    https://www.cnblogs.com/xiaomingzaixian/p/7286793.html(xml转化escape成字符串,再转字典)

    https://www.cnblogs.com/xiaomingzaixian/p/7286793.html(json()的使用)

    传入参数为:xml

    xml.sax.saxutils.escape.

    xml格式转化字符串,再用json.loads()转化成字典

    from xml.sax.saxutils importescapeimportjson

    #转换成字符串类型print(type(escape(res)))#转换成字典类型

    create_response =json.loads(escape(res))print(create_response)print(type(create_response))

    展开全文
  • 这周完成了第二个工具的开发,主要原理是调用第三方提供的公共的webservice接口,自己将每个webservice接口封装成了函数,输入参数即可以调用接口并获取到相应的查询信息。 该工具属于查询类工具,具有六个功能,...
  • 1、用SoapUI测试webservice接口,传入参数是xml格式时。xml格式需要将xml的外围增加<![CDATA[xml]]> 2、但是用python去做webservice测试,调用函数去传参时,直接将xml作为字符串的格式传入即可。 其中,...
  • Windows c++访问webservice接口

    千次阅读 2018-02-11 23:16:26
    这样我们才可以调用别人提供的ws接口例如,在c++中可使用xmlhttprequest访问webservice接口。我们已调用天气的ws接口为例,来实现ws接口的调用#import "msxml6.dll" using namespace MSXML2; void ...
  • java调用C# webservice接口使用axis报错 SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize. 解决方法:设置返回值类型 //call....
  • java 调用webservice接口(.asmx).net

    千次阅读 2019-09-23 10:59:34
    拿到对接公司的一个接口,是用.net编写的webservice接口(.asmx),接口方会给到接口地址、方法名、参数及对方那边的返回值类型、测试数据。如果没有一下这些,那么就可以向客户那边索取。例(我这边接口方提供的数据...
  • 本人初学webservice,平台用spring+cxf+ibatis,在调用接口中含返回自定义对象的方法时,就会报ClassCastException,即方法: public List&lt;User&gt; getUserList() 调用返回值为基本类型的方法,则没...
  • BOS WebService 接口开发与调用

    千次阅读 2017-04-18 14:40:23
    一.建立Façade或者Entity,本案例中以Fa...1、发布成WebService的方法,其方法参数和返回值类型必须是下列列表中的类型,否则发布时看不见方法。是否可以添加异常未尝试。 2、早期的BOS Studio发布元数据是有BUG...
  • 金蝶EAS8.2二次开发,做webservice接口

    千次阅读 2020-01-13 17:00:54
    1.WebService接口调用及调试 2.BoswebService原理 由SAOP,WADL,以及uudi等几块技术组成,以xml格式进行数据的传输 在bos中只能发布Entity和Façade两种元数据类型.在建立webService功能时最好使用Façade 并且提供...
  • 1. webservice 不能返回泛型接口集合IList,解决办法如下链接: ... 解决方法描述详细,并且多样,可以根据...2. webservice 参数为接口类型、或者自定义类中有接口变量定义,解决办法如下链接: 参考资料:http://...
  • 【问题描述】 今天负责开发网站的兄弟给webService增加了一个新接口SetPara,根据经验在Android...对照了一下接口文档,网站地址正确、接口名称正确、参数类型正确、返回值类型也正确。到底是因为什么造成的呢?...
  • 对于xfire动态调用webservice接口

    千次阅读 2016-03-24 09:50:53
    xfire是辣么过时,由于用到了,不能不研究一下。 其中重要参考的文档:... 复杂类型返回值类型为 org.w3c.dom.Document 类型对象 /* 解析第一个参数开始 */ Document doc = (Document) os
  • webservice通用接口

    千次阅读 2016-07-29 10:01:43
    /** * @方法名称: sendMessage * @param url 访问路径 * @param namespaceURI webService 命名空间 * @param methodName 调用接口方法 * @param opAddEntryArgs 传...返回值类型 与Object[] 一一对应 * @return 返回对
  • /** * */ package org.fkjava.cfx.ws; import java.util.List; import java.util.Map;...import javax.jws.WebService; import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import org.
  • /** * */ package org.fkjava.cfx.ws; import java.util.List;...import javax.jws.WebService; import org.fkjava.cfx.domain.Cat; import org.fkjava.cfx.domain.User; /** * @author Kevin * Web Services
  • webservice可访问,已访问到接口方法,参数和返回值都是string类型的。就是最后执行该方法时报错”Fault occurred while processing“。 无论静态添加web引用或服务引用,还是代码动态添加,都是一样的错。动态调用...
  • 快销e通要使用人员定位系统的几个功能,boss要求搞几个webservice接口。采用xfire来创建接口,具体的配置参见博客上的...当返回值为list的时候,需要配置一个xml来描述类型,可以网上搜索一下。或者直接使用泛型list
  • 第一次接触接口 ,对方给了我两个资料,一个说明,main.java 就是让我取出我们数据库中的数据,name不变,根据name取出数据存入value写成xml,在线等大神帮助 1.说明: 功能:数据归档 方法定义: int ...
  • 折腾了半天终于调通了接口,取到了接口函数的返回值,如下:call.invoke(params)然而并没有结束,对方给的接口文档中说明了接口函数中有个out类型的参数,那个才是真正要返回给我们的内容。 网上找了很久,发现有...
  • 最近开始写WebService的客户端模块,客户十分的麻烦要求在客户端修改...但是我的WebService接口返回的是XML格式的String类型的数据,它是DataSet的对象引用的GetXML()的返回值。在客户端修改颇为不易。 private void

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 121
精华内容 48
关键字:

webservice接口返回值类型