因工作需要调用webservice接口,不想直接生成类,直接通过相关JAR包调用webservice接口,目前尝试过以下几种方式:
一、axis方式(现在系统在用)
maven外用包:
<dependency>
<groupId>org.apache.axis</groupId>
<artifactId>axis</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>axis</groupId>
<artifactId>axis-jaxrpc</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>commons-discovery</groupId>
<artifactId>commons-discovery</artifactId>
<version>0.5</version>
</dependency>
如果使用日志包,则要在maven排除
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@org.springframework.stereotype.Service
public class WebService {
public static void main(String[] args) {
try {
String endpoint = "WEBSERVICE_URL";//配置要请求的WEBSERVICE_URL
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
// WSDL里面描述的接口名称(要调用的方法)
call.setOperationName("接口方法");
// call.setEncodingStyle(namespaceURI);
// 接口方法的参数名, 参数类型,参数模式 IN(输入), OUT(输出) or INOUT(输入输出)
call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
// 设置被调用方法的返回值类型
call.setReturnType(XMLType.XSD_SCHEMA);
// 设置方法中参数的值
Object[] paramValues = new Object[] { "****","*****", "****",
"****", "*****", "***" };
// 解析返回结果
call.invoke(paramValues);
String resultXML = call.getResponseMessage().getSOAPPartAsString();
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、axis2调用方法
此方法在本地IDEA和eclipse测试开发运行正常,但部署后会与springboot1.x中tomcat启动冲突,目前没有找到解决方法。
maven引用:
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-adb</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-kernel</artifactId>
<version>1.4</version>
</dependency>
注意:也需要排除日志引用
public Map<String, String> toUser(Map<String, String> map) {
Map<String, String> resultMap = new HashMap<String, String>();
try {
Options options = new Options();
// 指定调用WebService的URL
EndpointReference targetEPR = new EndpointReference("************");
options.setTo(targetEPR);
// options.setAction("urn:getPrice");
ServiceClient sender = new ServiceClient();
sender.setOptions(options);
OMFactory fac = OMAbstractFactory.getOMFactory();
String tns = "NL";
// 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事
OMNamespace omNs = fac.createOMNamespace(tns, "");
//调用的接口方法名
OMElement method = fac.createOMElement("tranfer", omNs);
//方法对应参数名
OMElement merchant_id = fac.createOMElement("merchant_id", omNs);
merchant_id.addChild(fac.createOMText(merchant_id, "****"));
method.addChild(merchant_id);
method.build();
OMElement result = sender.sendReceive(method);
resultMap = XMLUtil.strXmlToMap(result.toString());
// resultMap.put("resultStatus", statusMap.get("result"));
resultMap.put("resultXML", result.toString());
System.out.println(result);
// System.out.println(XMLUtil.doXMLParse(result.toString()));
return resultMap;
} catch (AxisFault axisFault) {
axisFault.printStackTrace();
resultMap.put("response_code", "-99");
resultMap.put("resultXML", "request error");
} catch (Exception e) {
e.printStackTrace();
resultMap.put("response_code", "-99");
resultMap.put("resultXML", "request error");
}
return resultMap;
}
三、cxf 调用web service 方式
maven引用:
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-core</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-bindings-soap</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-databinding-jaxb</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-udp</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-addr</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-wsdl</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-ws-policy</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.neethi</groupId>
<artifactId>neethi</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.apache.ws.xmlschema</groupId>
<artifactId>xmlschema-core</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.27</version>
</dependency>
JAVA代码:主要是返回值没有找到相关方法全部获取
public static void main(String[] args) {
// 创建动态客户端
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("https://********?wsdl");
// 需要密码的情况需要加上用户名和密码
// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,
// PASS_WORD));
Object[] objects = new Object[0];
try {
// invoke("方法名",参数1,参数2,参数3....);
objects = client.invoke("getInfo", "Leftso");
System.out.println("返回数据:" + objects[0]);
} catch (java.lang.Exception e) {
e.printStackTrace();
}
}
四、xfire 调用web service
打包后,执行前需要将spring 1.X.jar删除