java调用wcf控件的两种交互

1.axis方式

package wsdl.axis;

import java.net.MalformedURLException;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class Test2 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  String str = "";
  String endpoint = "http://172.50.9.161:4000/Marine/service";
  String namespace = "http://www.Service.Marine";
  String methodName = "Test2";
  Service service = new Service();
  Call call = null;
  try {
   call = (Call) service.createCall();
  } catch (ServiceException e1) {
   e1.printStackTrace();
  }
  try {
   call.setTargetEndpointAddress(new java.net.URL(endpoint));
  } catch (MalformedURLException e1) {
   e1.printStackTrace();
  }
  call.setUseSOAPAction(true);
  call.setSOAPActionURI("http://www.Service.Marine/IMarineService/Test2");
  call.setOperationName(new QName(namespace, methodName));
  call.addParameter(new javax.xml.namespace.QName(namespace, "strTest"),
    org.apache.axis.encoding.XMLType.XSD_STRING,
    javax.xml.rpc.ParameterMode.IN);// document访问格式,必须
  call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
  try {
   str = (String) call.invoke(new Object[] { "sss"});
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   
  }
  System.out.println("服务器返回值是:" + str + "!");
 }
}

 

注意 1)这里需要注意的参数名称问题,java的实参名称要与.net的形参保持一致才能在.net端口接受到。

         2)本地静态调用的时候无错误,但是放在web工程下运行,程序返回等都正常,但是java控制台会抛出找不到方法名称的异常。目前还没有找到具体原因

2.cxf方式

package cxf;

import javax.xml.namespace.QName;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

public class CallDNet {
 /**
  * @param args
  */
 public static void main(String[] args) {
  Object[] replys = null;
  try {
   JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory
     .newInstance();
   Client client = dcf
     .createClient("http://127.0.0.1:4000/Marine/service?wsdl");
   String namespace = "http://www.Service.Marine";
   replys = client.invoke(new QName(namespace, "Test2"), "dsadsadsa");
  } catch (Exception e) {
   e.printStackTrace();
  }
  for (Object o : replys) {
   // System.out.println(o);
  }
  System.out.println(replys[0]);
 }

}

 说明一下,2种jar同时存在一个工程下的时候,需要吧cxf的依赖包放在axis依赖包的前面加载。而且cxf形式的参数限制宽松,不需要对应具体参数名称,而且参数个数多的时候系统也补会报错

3.axis2 调用方式

package client;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;

public class Axis2ServiceClient {

    public static void main(String[] args) throws AxisFault {
        EndpointReference targetEPR = new EndpointReference("http://172.50.9.159:4000/Marine/service?wsdl");
        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace("http://www.Service.Marine", "tns");//命名空间
        OMElement method2 = fac.createOMElement("Test2", omNs);//要调用的接口方法名称
        OMElement value1 = fac.createOMElement("strTest", omNs);//方法的第一个参数名称
        value1.addChild(fac.createOMText(value1, "ccc"));//设定参数的值
        method2.addChild(value1);//方法设置参数

        Options options = new Options();
        options.setAction("http://www.Service.Marine/IMarineService/Test2");
        options.setTo(targetEPR);//设定webservice地址
        options.setTransportInProtocol(Constants.TRANSPORT_HTTP);//设定传输协议
        ServiceClient sender = new ServiceClient();
        sender.setOptions(options);

        OMElement result2 = sender.sendReceive(method2);//调用接口方法
        System.out.println(result2);//打印接口返回结果
    }
}

最少依赖jar

时间: 2024-10-29 22:09:03

java调用wcf控件的两种交互的相关文章

关于java调用OCX控件的问题

问题描述 公司从其他公司拿了个OCX文件跟借口文档说明,说是用java调用里面的方法为什么我调用的时候提示如图所示的错误啊?不会是没有那个方法吧,是不是我什么地方错了?!?!我下载了jacob.dll跟jar包版本是16jdk版本是1.6-u25jacob.dll文件也放在system32跟jdk/jre/bin目录下,还是报错跪求大神指点...... 解决方案 解决方案二:所示少时诵诗书

Android开发之基本控件和四种布局方式详解_Android

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

Android开发之基本控件和四种布局方式详解

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

java swing 把控件转化为BufferedImage

Java swing 把控件映射为BufferedImage 如何把java swing的可视控件 转化为BufferedImage 呢? 直接上代码: Java代码   /***           * convert JTextArea to image           * @param ta           * @param destFile           * @param format           */           public static Buffere

如何理解java的这种方法,有两种get方法连在一起

问题描述 如何理解java的这种方法,有两种get方法连在一起 对象.get( ).getId( )==id 如何理解这条程序语句 如何理解java的这种方法,有两种get方法连在一起 解决方案 这种基本是list集合用的,,比如List中放一个User对象,,通过list.get(0).getId();这个指的就是取出list集合中的第一个对象的Id属性 解决方案二: 第一个get返回一个对象,它包含第二个方法,比如 class A { public int getid() { return

c#-Arcengine +C# 中窗体之间调用AO控件的问题

问题描述 Arcengine +C# 中窗体之间调用AO控件的问题 简答的说有两个窗体 想要简单的在Form2中调用Form1的Axmapcontrol1的get_layer() _方法 comboBox1.Items.Add(frm.axMapControl1.get_Layer(i).Name); 我自己的方式是在Form1中把axmapcontrol1的属性设置为public然后在Form2中定义一个Form变量来调用 为什么值始终传不过去 而非AO控件可以这样传值 解决方案 c#中窗体之

cocos2d-x-cocos怎么调用Android控件并反馈控件的输入信息

问题描述 cocos怎么调用Android控件并反馈控件的输入信息 我知道可以用JNI实现JAVA和C++之间的相互调用,但是如何把JAVA的数据再反馈给Cocos呢? 解决方案 参考:http://www.tuicool.com/articles/UbaEre

Javascript和Java语言有什么关系?两种语言间的异同比较_java

虽然Javascript与Java有紧密的联系,但却是两个公司开发的不同的两个产品.Java是Sun公司推出的新一代面向对象的程序设计语言.特别适合于Internet应用程序开发:而Javascript是Sun与Netscape公司联合推出的产品,是为了扩展Netscape Navigator功能而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言.且它的前身是Live Script,而Java的前身是Oak语言.下面就对两种语言间的异同作如下比较: (1)基于对象和面向对象 Jav

跨线程调用窗体控件

本文转载:http://www.csharpwin.com/csharpspace/11279r6763.shtml   执行耗时较长的操作时,使用多线程是明智之举,它可以提高程序 UI 的响应速度,使得一切运行显得更为快速.在 Windows 中进行多线程编程曾经是 C++ 开发人员的专属特权,但是现在,可以使用所有兼容 Microsoft .NET 的语言来编写. 不过Windows 窗体体系结构对线程使用制定了严格的规则.如果只是编写单线程应用程序,则没必要知道这些规则,这是因为单线程的代