一、需求
某个系统要把人员信息推送给我们的系统,准备采用webservice接口,实时调用的形式。
我们的系统要提供一个webservice接口,被调用后,把数据入库,然后返回结果。
可进行人员新增、修改、逻辑删除这些操作。
是一个比较简单的功能。(webservice是老方法了,其实用json更好。)
二、开发流程
1.为了保存人员信息,要在数据库现有的一张表中新增多个字段;
为了防止新增字段时导致表被锁、不可用,进而延误了其它操作该表的程序,可以如下操作:
(有次我们给大表加字段,锁了30多分钟……)
alter 大表的时候,可以增加 ALGORITHM=INPLACE, LOCK=NONE; 不锁表
例如:
ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE student ADD 'is_push' varchar(2) character set utf8_general_ci NULL DEFAULT '0' comment '是否推送,0未推送,1已推送', ALGORITHM=INPLACE, LOCK=NONE;
2.作为接口提供方,要写一个接口文档,告诉另一个系统的人。
接口文档包含:
(1)接口功能描述
(2)接口的测试url与生产url,例如:
http://10.123.123.123:8080/webservice/student?wsdl
http://10.111.111.1111:80/webservice/student?wsdl
(3)入参字段,可以用表格说明;以及入参样例
(4)出参字段,可以用表格说明;以及出参样例
3.开发webservice接口。本项目是spring项目,因此步骤如下:
(1)找到webservice用的xml配置文件,增加一个接口,例如:
<jaxws:endpoint id="newStudent" implementor="com.xxx.webservice.StudentReceiveImpl" address="/student" />
这里配置的就是url中的路径:"/student"
(2)由于数据库新增了字段,所以修改下对应的javabean,增加相应的字段
(3)增加一个接口类,webservice用,例如StudentReceive.java:(接收学生信息的意思)
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public interface StudentReceive {
@WebMethod
public String receiveMsg(String param);
}
(4)增加一个实现类,webservice用,例如StudentReceiveImpl.java,对应xml中配置的类:
@WebService(endpointInterface="com.xxx.webservice.StudentReceive")
public class StudentReceiveImpl implements StudentReceive {
@Override
@WebMethod(operationName="receiveMsg")
public String receiveMsg(String data){
System.out.println(data);
//省略入库操作
return null;
}
}
(5)处理webservice传输的报文,需要一些方法,因为它实际上包含了许多xml标签,例如使用com.fasterxml.jackson.databind.ObjectMapper对象:
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false);
om.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,false);
om.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//将收到的信息转为javabean对象;data是收到的string,studentBean是自己创建的javabean
StudentBean studentBean = om.readValue(data, StudentBean.class);
......
//返回webservice消息用的方法;backBean是自己创建的javabean
return om.writeValueAsString(backBean);
(6)之后,可以本地启动项目,用SoapUI测试一下这个接口是否通了,例如输入:
http://127.0.0.1:8080/webservice/student?wsdl
如果通了的话,就会显示出这个接口中有一个receiveMsg是可用的,然后传入参数、点击发送消息就可以了。(SoapUI使用方法此处略过)