最近项目上需要对接WebService通达信交易接口文件,接口,之前从来没有用过,这次都遇见了。记录下基础的使用和我遇见的问题。如果是报错找答案的,建议直接查看最后“遇见的问题”或搜索文章内容查看对应的问题。
正文
概述
WebService通达信交易接口文件,接口百度一搜,各个介绍的都非常详细,由于刚开始没接触,看的也不是很懂。首先记住一句话:WebService是一种跨编程语言和跨操作系统平台的远程调用技术。跨编程语言和跨操作系统平台:也就是说Asp.net开发的WebService用java代码调用完全没问题,和操作系统也没有关系。远程调用技术:也就是说网络是通的就能用。那么这个WebService到底是干嘛用的?
作用
不同系统之间进行对接!比如现在需要使用第三方公司的短信服务,使用WebService来调用它的服务,只需要第三方公司提供一个通达信交易接口文件,接口调用文档和WebService地址,就能根据文档地址编程去调用它开放的短信服务,发送短信。为什么是WebService?
优缺点
回到那句话,WebService是一种跨编程语言和跨操作系统平台的远程调用技术。优点:跨语言和跨操作系统:因为WevService是通过Xml语言进行描述的,XML主要的优点在于它既与平台无关,又与厂商无关。远程调用技术:不用担心防火墙的问题。。。缺点:服务端通达信交易接口文件,接口方为webservice则客户端也必须使用webservice。因为webservice使用xml传输数据,因此性能上不能满足高并发。有点笨重。。。其实WebService并不是非常流行,往往RESTful就能够达到需要,但是遇到了笔记还是要做的。
使用
只介绍对接WebService通达信交易接口文件,接口,生成请自行百度。这次对接了java的WebService通达信交易接口文件,接口和C#写的WebService通达信交易接口文件,接口。
public static void main(String[] args) {
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
//要得到的对象,是根据本地IService 通达信交易接口文件,接口取得的。
factoryBean.setServiceClass(IService .class);
//调用地址
factoryBean.setAddress('http://127.0.0.1:8080/jjh/webService/smsXXX');
//通过webservice取到IService的实现类,这个实现类才是你真正想要的,里面包括了你需要的东西。
IService service = (IService)factoryBean.create();
IhalloWorld hello = service.getHelloWorld('xxx');
System.out.println('Hello:'+hello.sendSms('XXX你好...'));
}
参考链接:JAVAwebservice之CXFWebService学习整理-JDK的wsimport命令和cxf的wsdl2java命令的区别和使用java通达信交易接口文件,接口调用——webservice就是一个RPC而已cxf的wsdl2java命令和JDK的wsimport命令的区别和使用
下面又对接了一个C#写的WebService通达信交易接口文件,接口,比如链接为:http://120.0.1:81/WebServiceCS/servicasmx,在这个链接后面加上?wsdl,即:http://120.0.1:81/WebServiceCS/servicasmx?wsdl也是可以使用cxf生成java代码的,但是注意一点,这通达信交易接口文件,接口是C#写的,xml只描述出实体信息,生成类似实体类的文件,没有现成的通达信交易接口文件,接口使用。一般其实也用不到cxf来生成,作用不大。参考例子:
public String sendMail(Object[] params) {
String soapaction = 'http://tempuri.org/'; // 域名,这是在server定义的,在链接里面看得到,下面介绍。
String operationName = 'Mail_Send';// 调用服务名
Service service = new Service();
String ret = '';
try {
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(url);
call.setOperationName(new QName(soapaction, operationName)); // 设置要调用的方法
call.addParameter(new QName(soapaction, 'vvvv'), // 需要传递的参数名
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.addParameter(new QName(soapaction, 'jjj'), // 需要传递的参数名
org.apache.axis.encoding.XMLType.XSD_STRING,
javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// (标准的返回类型)
call.setUseSOAPAction(true);
call.setSOAPActionURI(soapaction + operationName);//url,域名加方法名
ret = (String) call.invoke(params);// 调用方法并传递参数,params包含参数
} catch (Exception ex) {
ex.printStackTrace();
}
return ret;
}
其中operationName服务名和soapaction域名都在你的链接中可以找到http://120.0.1:81/WebServiceCS/servicasmx其中参数params数组根据你服务需要的参数来传,比如需要一个规范的xml字符串作为参数,使用dom4j进行操作。
Document doc = DocumentHelper.createDocument();
//增加根节点
Element books = doc.addElement('books');
//增加子元素
Element book1 = books.addElement('book');
Element title1 = book1.addElement('title');
Element author1 = book1.addElement('author');
Element book2 = books.addElement('book');
Element title2 = book2.addElement('title');
Element author2 = book2.addElement('author');
//为子节点添加属性
book1.addAttribute('id', '001');
//为元素添加内容
title1.setText('Harry Potter');
author1.setText('J K. Rowling');
book2.addAttribute('id', '002');
title2.setText('Learning XML');
author2.setText('Erik T. Ray');
OutputFormat format = OutputFormat.createCompactFormat();
format.setIndent(true); //设置是否缩进
format.setIndent(' '); //以四个空格方式实现缩进
format.setNewlines(true); //设置是否换行
//设置输出编码
format.setEncoding('gb2312');
StringWriter writer = new StringWriter();
XMLWriter output = new XMLWriter(writer, format);
try {
output.write(doc);
writer.close();
output.close();
System.out.println(writer.toString());//打印xml字符串
} catch (IOException e) {
e.printStackTrace();
}
打印结果
参考链接:Java调用webservice的.asmx后缀通达信交易接口文件,接口java调用webservice通达信交易接口文件,接口
遇见的问题
说实话开发起来挺快的,毕竟人家提供通达信交易接口文件,接口,东西都是现成的,最要命的问题就是报错了。
导包
包没导好,错少不了,可以参考这个博主的包导一导试试java调用webservice通达信交易接口文件,接口,遇见报错不要慌,参考一下这个解决:WebService几个常见的异常我这里遇到的一个问题就是:javlanNoClassDefFoundError:Couldnotinitializeclassorapachaxis.client.AxisClient我是由于commons-logginjar包依赖版本冲突导致的,commons-discovery.jar包里面依赖了commons-logging包,我自己导了commons-logging包,我的解决是排查commons-discovery对commons-logging的依赖:
commons-discovery
commons-discovery
0.5
commons-logging
commons-logging
commons-logging
commons-logging
1.2
上面两个都没解决我的问题,我感觉原因还是版本冲突了,,,最后我找到了一个解决方法:CXF报安全性错误CannotcreateasecureXMLInputFactory大佬就是大佬,然后我就调用之前添加了这行代码:
后续
后面项目部署到tomcat上面,发现jar包还是冲突啦!!!大概错误就是这样
Caused by: java.lang.NoSuchFieldError: REFLECTION
at com.sun.xml.bind.v2.model.impl.RuntimeModelBuilder.(RuntimeModelBuilder.java:43)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:344)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.(JAXBContextImpl.java:216)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:76)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:441)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
一番搜索后参照:stackoverflowjavlanNoSuchFieldError:REFLECTION发现是cosuxmbind:jaxb-core和cosuxmbind:jaxb-impl****两个包版本号不一致造成的冲突。首先查看jar包的依赖情况,使用idea查看依赖树,运行maven命令mvndependency:tree。不使用idea也一样,在pom文件位置打开cmd面板,如下,在路径处输入cmd回车,执行maven命令mvndependency:tree。查看jar包依赖情况:分别搜索jaxb-impl和jaxb-core,发现它们是jar包axis2-jaxws和cxf-rt-frontend-jaxws分别依赖的子包。版本号分别是7和1我这里是取消了axis2-jaxws对jaxb-impl的依赖,单独配置jaxb-impl的依赖,指定版本号和jaxb-core一致1最后将打包后的jaxb相关包替换在tomcat的包,使得版本一致,到此版本冲突问题解决。
参考地址集合
JAVAwebservice之CXFWebService学习整理-JDK的wsimport命令和cxf的wsdl2java命令的区别和使用java通达信交易接口文件,接口调用——webservice就是一个RPC而已cxf的wsdl2java命令和JDK的wsimport命令的区别和使用
Java调用webservice的.asmx后缀通达信交易接口文件,接口java调用webservice通达信交易接口文件,接口
stackoverflowjavlanNoSuchFieldError:REFLECTIONmavendependency:tree中反斜杠的含义如何查看Maven项目中的jar包依赖树情况?
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点
量化策略题目2023-05-12
这属于面值退市股,并购例如弱弱连手,重组,注入优质资产,达到股票所规定。才可重新上市,不知黑庄想走哪步数据分析-明空2023-01-25
事后诸葛亮谁都会,现在发这些和网上财经骗子天天吹,就是为了让股票高位接盘。当你看到这些消息,庄家都出货了,有本事说说1月10号以后,机构和基金都加仓了些啥?