cxf 用JaxWsDynamicClientFactory 怎么传递参数对象

yn799890274 2014-05-26 10:39:51
我用的是apache-cxf-2.6.14,直接用url调用远程webservice,代码如下:
JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient(hostUrl);
Object[] result = client.invoke(methodName, params);
其中params在远程webService中是一个对象,对象中有两个字段分别是userNo和productCode,我怎么做才能把对象传过去,如果我直接定义一个对象的话,会报”org.apache.cxf.interceptor.Fault: Marshalling Error: class com.model.paramModel nor any of its super class is known to this context“的异常,那么我该怎么做?最好有个demo,非常感谢!
...全文
13094 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
-mua 2015-09-17
  • 打赏
  • 举报
回复
http://reymont.iteye.com/blog/1511176 这个好理解
-mua 2015-09-17
  • 打赏
  • 举报
回复
不管怎么说 分享解决方法就是最厚道的 顶楼主
pp3599456 2015-04-28
  • 打赏
  • 举报
回复
楼主,我遇到类似问题,给个qq,想请教一下!
真实安宁 2015-03-05
  • 打赏
  • 举报
回复 1
看一下这个。 http://cxf.apache.org/docs/dynamic-clients.html 要简单很多。
真实安宁 2015-03-05
  • 打赏
  • 举报
回复
我也遇到这个问题,顶一个。
qqtian5 2014-09-29
  • 打赏
  • 举报
回复
yn799890274 2014-05-27
  • 打赏
  • 举报
回复
自己顶一下
tony4geek 2014-05-27
  • 打赏
  • 举报
回复
yn799890274 2014-05-27
  • 打赏
  • 举报
回复 2
问题已经解决,不容易呀,主要是对CXF不熟悉,通过查询CXF文档和apache-cxf-2.6.14\samples\wsdl_first_dynamic_client这个DEMO,最终把问题解决了,在此分享一下,不多说直接贴代码,其中有些敏感信息,不方便贴出,忘请见谅,希望对遇到同类问题的朋友有点用处。

public class GetWebServiceData {
    private static final QName SERVICE_NAME = new QName(namespace, serviceName);
    /**
     * 
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        // 远程webService的URL
        String hostUrl = "****************?wsdl";
        try {
            // 创建动态客户端
            JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
            // 创建客户端连接
            Client client = factory.createClient(hostUrl, SERVICE_NAME);
            ClientImpl clientImpl = (ClientImpl) client;
            Endpoint endpoint = clientImpl.getEndpoint();
            // Make use of CXF service model to introspect the existing WSDL
            ServiceInfo serviceInfo = endpoint.getService().getServiceInfos().get(0);
            // 创建QName来指定NameSpace和要调用的service
            QName bindingName = new QName(namespace, service);
            BindingInfo binding = serviceInfo.getBinding(bindingName);
            // 创建QName来指定NameSpace和要调用的方法
            QName opName = new QName(namespace, methodName);
            
            BindingOperationInfo boi = binding.getOperation(opName);
            BindingMessageInfo inputMessageInfo = boi.getInput();
            List<MessagePartInfo> parts = inputMessageInfo.getMessageParts();
            // 取得对象实例
            MessagePartInfo partInfo = parts.get(0);
            Class<?> partClass = partInfo.getTypeClass();
            Object inputObject = partClass.newInstance();

            // 取得字段的set方法并赋值
            PropertyDescriptor partPropertyDescriptor = new PropertyDescriptor(字段名, partClass);
            Method userNoSetter = partPropertyDescriptor.getWriteMethod();
            userNoSetter.invoke(inputObject, 属性值);

            // 取得字段的set方法并赋值
            PropertyDescriptor partPropertyDescriptor2 = new PropertyDescriptor(字段名, partClass);
            Method productCodeSetter = partPropertyDescriptor2.getWriteMethod();
            productCodeSetter.invoke(inputObject, 属性值);

            // 调用客户端invoke()方法,把inputObject传递给要调用的方法并取得结果对象
            Object[] result = client.invoke(opName, inputObject);
            // 取得的结果是一个对象
            Class<?> resultClass = result[0].getClass();
            // 取得返回结果的get方法并得到它的值
            PropertyDescriptor resultDescriptor = new PropertyDescriptor(结果字段名, resultClass);
            Object resultGetter = resultDescriptor.getReadMethod().invoke(result[0]);
            System.out.println("result:" + resultGetter);
            // 取得返回结果的get方法并得到它的值
            PropertyDescriptor tokenDescriptor = new PropertyDescriptor(结果字段名, resultClass);
            // 取得的是一个对象实例
            Object getObj= tokenDescriptor.getReadMethod().invoke(result[0]);
            if(tokenGetter != null) {
                Class<?> resultTokenClass = tokenDescriptor.getReadMethod().invoke(result[0]).getClass();
                // 得到对象实例下的***属性值
                PropertyDescriptor expiredTimeDescriptor = new PropertyDescriptor(字段名, resultTokenClass);
                Object getter = expiredTimeDescriptor.getReadMethod().invoke(getObj);
                System.out.println("字段名:" + getter );
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
yn799890274 2014-05-27
  • 打赏
  • 举报
回复
要散分了,没人的话,40分全给2楼了

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧