通过调用webservice接口传入单据日期,传出该单据日期下的所有出库申请单的单据号、单据日期、人员、部门(json格式)
1.在public端的nc.itf下新建一个名叫ws的包,在包下建一个名为ICkdWebService.java的接口,在接口里面写一个接口方法
package nc.itf.ws;
import nc.vo.pub.BusinessException;
public interface ICkdWebService {
public String reqData(String jsonInfo) throws BusinessException;
}
2.在private端的nc.impl下新建一个名叫ws的包,在包下建一个名为CkdWebServiceImpl.java的接口实现类,实现接口中的方法
package nc.impl.ws;
public class CkdWebServiceImpl implements ICkdWebService{
@Override
public String reqData(String jsonInfo) {
return null;
}
}
3.右击接口–>WS Tools–>WSDL,右击接口实现类–>WS Tools–>XSD;这样会在根目录下生成一个ws的文件夹,把生成文件夹中的ICkdWebService.wsdl放到跟接口同一个文件夹下,CkdWebServiceImpl.xsd放到跟接口实现类同一个文件夹下;删掉刚刚生成的ws文件夹
4.运行–>调试配置–>yhly_Server–>自变量,的最后加上,uapws
,点击应用,然后关闭
5.在最下面的yhlypx文件夹的META-INF文件夹下新建一个wepservice.upm文件
<?xml version='1.0' encoding='UTF-8'?>
<module name="yhlypx">//模块名
<public>
<component remote="true" singleton="true" tx="CMT">
<interface>nc.itf.ws.ICkdWebService</interface>//接口路径
<implementation>nc.impl.ws.CkdWebServiceImpl</implementation>//实现类路径
<extension class="nc.uap.ws.deploy.OxbWSExtensionProcessor">
<wsdl>nc/itf/ws/ICkdWebService.wsdl</wsdl>//wsdl路径的后半段
<address>/ICkdWebService</address>//接口名
</extension>
</component>
</public>
<private>
</private>
</module>
6.启动服务,清缓存
7.json格式
{
"data":"2023-04-07"
}
8.在public端的nc.vo下新建一个名叫ws的包,在包里新建一个CksqdHeadJsonVO.java类
CksqdHeadJsonVO.java
只传能编辑的,自定义参照穿过来的一般都是编码或名称,需要将其转换成主键(因为数据库自定义参照数据库里存的是主键)
package nc.vo.ws;
public class CksqdHeadJsonVO1 {
public String vbillno;
public String dbilldate;
public String personnel;
public String department;
public String getVbillno() {
return vbillno;
}
public void setVbillno(String vbillno) {
this.vbillno = vbillno;
}
public String getDbilldate() {
return dbilldate;
}
public void setDbilldate(String dbilldate) {
this.dbilldate = dbilldate;
}
public String getPersonnel() {
return personnel;
}
public void setPersonnel(String personnel) {
this.personnel = personnel;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
9.打开浏览器,输入http://127.0.0.1:[端口号]/uapws
检查接口是否发布
用户名、密码在D:\peixun\lianxi\LXHome\LXHome\hotwebs\uapws\WEB-INF文件下的config.xml下
<?xml version="1.0" encoding="UTF-8"?>
<config>
<action-mappings >
<action path="/getAllServices.ajax" type="nc.uap.ws.console.action.GetServicesAction" />
<action path="/login.ajax" type="nc.uap.ws.console.action.LoginAction" />
<action path="/getBasicInfo.ajax" type="nc.uap.ws.console.action.GetBasicInfoAction" />
<action path="/getWssInfo.ajax" type="nc.uap.ws.console.action.GetWssInfoAction" />
<action path="/getKSInfo.ajax" type="nc.uap.ws.console.action.GetKSInfoAction" />
<action path="/saveDoc.ajax" type="nc.uap.ws.console.action.SaveDocAction" />
<action path="/loadDoc.ajax" type="nc.uap.ws.console.action.LoadDocAction" />
<action path="/loadReqTemplete.ajax" type="nc.uap.ws.console.action.GenSoapRequestAction" />
<action path="/soapRequest.ajax" type="nc.uap.ws.console.action.SoapRequestAction" />
<action path="/soapFormat.ajax" type="nc.uap.ws.console.action.SoapFormatAction" />
</action-mappings>
<login name = "administrator" password="ufsoft*12345"/>//用户名和密码在这里
</config>
10.检验json语句是否正确的网址
https://www.bejson.com/
11.字符串转化为json格式
12.登陆之后,再在网址后加上service,找到自己的接口,复制地址,打开测试软件,点击SOAP,然后把地址填进去
13.自定义参照的翻译公式
vo里要翻译的字段名->getcolvalue(表名,要翻译的值,code,vo里要翻译的字段名)
vo里要翻译的字段名->getcolvalue2(表名,要翻译的值,code,vo里要翻译的字段名,code,vo里要翻译的字段名)
getcolvalue2可以加多个where条件
14.CkdWebServiceImpl.java
package nc.impl.ws;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import nc.bs.dao.BaseDAO;
import nc.bs.framework.common.InvocationInfoProxy;
import nc.bs.logging.Logger;
import nc.itf.ws.ICkdWebService1;
import nc.jdbc.framework.processor.ArrayListProcessor;
import nc.ui.yhlypx.util.NullValueUtils;
import nc.vo.pub.BusinessException;
import nc.vo.ws.CksqdHeadJsonVO1;
import nc.vo.ws.ResultParam1;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.Gson;
public class CkdWebServiceImpl1 implements ICkdWebService1{
@Override
public String reqData(String jsonInfo) {
ResultParam1<CksqdHeadJsonVO1> returnParam1 = new ResultParam1<CksqdHeadJsonVO1>();
try {
init();
JSONObject jsonObject = JSONObject.parseObject(jsonInfo);
String date = jsonObject.getString("date");
StringBuilder sb = new StringBuilder();
sb.append(" select h.vbillno, h.dbilldate, p.name, d.name ");
sb.append(" from kf_kfcksqd h ");
sb.append(" left join bd_psndoc p ");
sb.append(" on p.pk_psndoc = h.personnel ");
sb.append(" left join org_dept d ");
sb.append(" on d.pk_dept = h.department ");
sb.append(" where nvl(h.dr, 0) = 0 ");
sb.append(" and substr(h.dbilldate, 1, 10) = '" + date + "'");
List<Object[]> list = (List<Object[]>) (getDao().executeQuery(sb.toString(), new ArrayListProcessor()));
if(list == null || list.size() == 0){
returnParam1.setCode("500");
returnParam1.setMessage("未查询到记录");
return new Gson().toJson(returnParam1);
}
List<CksqdHeadJsonVO1> paramList = new ArrayList<CksqdHeadJsonVO1>();
for(Iterator iterator = list.iterator(); iterator.hasNext();){
Object[] objs = (Object[]) iterator.next();
CksqdHeadJsonVO1 headvo = new CksqdHeadJsonVO1();
headvo.setVbillno(NullValueUtils.getNullStringValue(objs[0]));
headvo.setDbilldate(NullValueUtils.getNullStringValue(objs[1]));
headvo.setPersonnel(NullValueUtils.getNullStringValue(objs[2]));
headvo.setDepartment(NullValueUtils.getNullStringValue(objs[3]));
paramList.add(headvo);
}
returnParam1.setCode("200");
returnParam1.setMessage("查询成功");
returnParam1.setDatas(paramList.toArray(new CksqdHeadJsonVO1[0]));
return new Gson().toJson(returnParam1);
} catch (BusinessException e) {
String code = "500";
returnParam1.setCode(code);
returnParam1.setMessage("查询出错" + e.getMessage());
}
return new Gson().toJson(returnParam1);
}
/**
* 使用数据库
*/
private BaseDAO dao;
private BaseDAO getDao() {
if(dao == null) {
dao = new BaseDAO();
}
return dao;
}
/**
* 初始化数据源、集团、用户
*/
private void init(){
InvocationInfoProxy.getInstance().setUserDataSource(getEnvInfo("datasource"));
InvocationInfoProxy.getInstance().setGroupId(getEnvInfo("groupid"));
InvocationInfoProxy.getInstance().setUserId(getEnvInfo("userid"));
}
/**
* 得到配置文件参数值
*/
public String getEnvInfo(String param) {
// 属性集合对象
Properties prop = new Properties();
try {
InputStream fis = CkdWebServiceImpl.class.getResourceAsStream("data.properties");
// 将属性文件流装载到Properties对象中
prop.load(fis);
} catch (Exception e) {
Logger.debug(e);
}
return prop.getProperty(param);
}
}
15.data.properties
datasource=design
groupid=0001A1100000000002O7
userid=1001A11000000000002X
16.ResultParam.java
package nc.vo.ws;
public class ResultParam1<E> {
private String code;
private String message;
private E[] datas;
public E[] getDatas() {
return datas;
}
public void setDatas(E[] datas) {
this.datas = datas;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
17.注意事项
1.不在json里用UFDate、UFDouble
CksqdJson jsonvo = new Gson().fromJson(jsonInfo, CksqdJson.class);
2.在json里用UFDate、UFDouble
GsonBuilder gsonBuilder = new GsonBuilder();
UFDataTypeDeserializer ufDeserializer = new UFDataTypeDeserializer();
gsonBuilder.registerTypeAdapter(UFDateTime.class, ufDeserializer);
gsonBuilder.registerTypeAdapter(UFDate.class, ufDeserializer);
gsonBuilder.registerTypeAdapter(UFBoolean.class, ufDeserializer);
gsonBuilder.registerTypeAdapter(UFDouble.class, ufDeserializer);
gsonBuilder.registerTypeAdapter(UFTime.class, ufDeserializer);
gsonBuilder.registerTypeAdapter(UFLiteralDate.class, ufDeserializer);
CksqdJson param = gsonBuilder.create().fromJson(jsonInfo.toString(),CksqdJson.class);
3.webservice在接口里面加了方法后,想要在SOAP中显示出来需要重新生成wsdl和xsd文件,然后重启服务