JDK1.6之后内置了webservice,可以直接用注解使用@Webservice
生成服务端代码的方式
一共有三种方式, 1. 视图方式, 2 . 标准方法, 3 . cxf调用
一 . 发布服务
1 . 对外服务接口代码
package com.test.service;
import com.test.client.GetMobileCodeInfo;
import javax.jws.WebService;
@WebService
public interface webserviceTestClient {
/**
* 对外服务接口
* @param RegID 机构ID
* @param SendID 发送编号
* @param LogType 类型
* @param Logs 日志记录
* @return
*/
public String AcceptLogs(String RegID, String SendID, String LogType, String Logs);
}
2 . 对外服务接口实现类代码
package com.test.service;
import javax.jws.WebService;
@WebService
public class WebServiceITestmpl implements webserviceTestClient {
@Override
/**
* 对外服务接口 实现类
* @param RegID 机构ID
* @param SendID 发送编号
* @param LogType 类型
* @param Logs 日志记录
* @return
*/
public String AcceptLogs(String RegID, String SendID, String LogType, String Logs) {
System.out.println(RegID);
System.out.println(SendID);
System.out.println(LogType);
System.out.println(Logs);
return "success!";
}
}
3 . 启动服务发布
package com.test.service;
import javax.xml.ws.Endpoint;
public class TestPublist {
public static void main(String[] args) {
/**
* 对外发布服务
* 参数一: address 能访问到的路径就行
* 参数二: 实现类对象
*/
Endpoint.publish("http://localhost:8888/ws", new WebServiceITestmpl());
}
}
4 . 发布成功
服务发布成功之后,服务一直处于监听状态
可以通过浏览器访问 : http://localhost:8888/ws?wsdl 默认地址加上 ?wsdl 发布成功会显示wsdl说明文档
二 . 调用服务
1 . 需要先通过wsdl说明文档生成发布方的代码 (wsdl地址)
2 . 生成的发布方代码
3 . 将 .java结尾的文件都复制到项目与文件目录一致的包下边
4 . 调用代码
main方法启动测试
package com.test.client;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;
public class clientTest {
public static void main(String[] args) throws MalformedURLException {
//参数一 : wsdl文档中的 targetNamespace 地址 参数二: targetNamespace 地址后边的name (视图) 地址
QName qName = new QName("http://service.test.com/", "WebServiceITestmplService");
Service service = Service.create(new URL("http://localhost:8888/ws?wsdl"), qName);
//参数为 : 实现类的对象
WebServiceITestmpl portType = service.getPort(WebServiceITestmpl.class);
//测试调用,传递测试参数数据
String s = portType.acceptLogs("1101011001120", "123456789", "login", "推送日志");
System.out.println(s);
}
}
测试结果:
直接调用,不用生成服务端接口,new Service() 调用
两个方法相同,只是参数多少
//单个参数
public String findUserInfoByName(String name) {
String result = null;
try {
String endpoint = "http://test.com/CrmInfo/CrmInfoPort?wsdl";
//直接引用远程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
/**
*注意这里,要设置Namespace
*/
call.setOperationName(new QName("http://server.com/","findUserInfoByName"));//WSDL里面描述的接口名称
call.addParameter("arg0", XMLType.XSD_STRING,
ParameterMode.IN);//接口的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型
result = (String)call.invoke(new Object[]{name});
//给方法传递参数,并且调用方法
System.out.println("result is :"+result);
}
catch (Exception e) {
System.err.println(e.toString());
}
return result;
}
//多个参数
Call call = null;
String returnstr = "";
try {
org.apache.axis.client.Service axiService = new org.apache.axis.client.Service();
call = (Call) axiService.createCall();
call.setTargetEndpointAddress(new java.net.URL(url));
//参数一: targerNameSpace 参数二: 方法的名字
call.setOperationName(new QName("http://service.test.com/", "AcceptLogs"));// 设置操作的名称。
call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型, 注意如果写的是参数名的话可能服务端接收的数据为null,用arg0...可以!
call.addParameter("arg1", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
call.addParameter("arg2", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
call.addParameter("arg3", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
call.setReturnType(XMLType.XSD_STRING);// 返回的数据类型
String ret = (String) call.invoke(new Object[]{RegID, "123456", "login", loginListXml});// 执行调用
returnstr = new String(ret.getBytes());
logger.info(returnstr);
} catch (Exception e) {
e.printStackTrace();
}
问题:
java 调用webservice 服务端收到参数为null
务端得不到参数,后来发现只改一个地方就可以了:
call.addParameter(“arg0”, XMLType.XSD_DATE,ParameterMode.IN); 这样是OK的
call.addParameter(“name”, XMLType.XSD_DATE,ParameterMode.IN); 这样服务端接收到的参数就是 null