- 在nchome中的modules里对应的业务模块的META-INF中添加 occ.rest文件,开发项目中也是在项目对应的META-INF下,如图:
在模块的META-INF文件夹下,增加occ.rest扩展名的接口文件,内容为xml格式,参考脚本如下:
<?xml version="1.0" encoding='gb2312'?>
<module>
<rest>
<resource classname="nc.pubitf.api.rest.occ.SaleTargetRestResource" exinfo=""/>
</rest>
</module>
- 在public端(有些人也算放在private端,看个人吧)对应的目录结构下,添加相关的接口处理服务类SaleTargetRestResource,内容如下:
package nc.pubitf.api.rest.occ;
import java.util.ArrayList;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import mobile.bc.api.base.PublicRestResource;
import nc.bs.framework.common.NCLocator;
import nc.itf.uap.IUAPQueryBS;
import nc.jdbc.framework.SQLParameter;
import nc.jdbc.framework.processor.BeanListProcessor;
import nc.pubitf.api.rest.base.ErrInfoEnum;
import nc.pubitf.api.rest.base.Response;
import nc.vo.pub.BusinessException;
@Path("/occ/query")
public class SaleTargetRestResource extends PublicRestResource{
private static IUAPQueryBS queryBS = NCLocator.getInstance().lookup(IUAPQueryBS.class);
@POST
@Path("/sale-target-info")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String querySaleTarget(QuerySaleTargetInfoRequestParam queryParam) {
Response<List<SaleTargetInfoVO>> response = new Response<>();
try {
queryParam.checkParamIsNull();
} catch (Exception e) {
return response.err(ErrInfoEnum.INVLIAD_PARAMS.getCode(), e.getMessage()).toString();
}
List<SaleTargetInfoVO> targetInfoVO = getSaleTargetInfo(queryParam);
response.ok(targetInfoVO);
return response.toString();
}
@SuppressWarnings("unchecked")
private List<SaleTargetInfoVO> getSaleTargetInfo(QuerySaleTargetInfoRequestParam queryParam) {
String sql = "select distinct sr_target.blowsetflag,\r\n" +
" sr_target.dbegindate,\r\n" +
" sr_target.denddate,\r\n" +
" sr_target.fcyclesetflag,\r\n" +
" sr_target.fheadshowflag,\r\n" +
" sr_target.fmaintainflag,\r\n" +
" sr_target.fmarsetflag,\r\n" +
" sr_target.fyearflag,\r\n" +
" sr_target.pk_group,\r\n" +
" sr_target.pk_org,\r\n" +
" sr_target.pk_target,\r\n" +
" sr_target.vcode,\r\n" +
" sr_target.vname,\r\n" +
" sr_target.vnote\r\n" +
" from sr_target sr_target\r\n" +
" where sr_target.pk_org = '?'\r\n" +
" and nvl(sr_target.dr, 0) = 0\r\n" +
" order by sr_target.pk_target";
SQLParameter sqlParam = new SQLParameter();
sqlParam.addParam(queryParam.getPkOrg());
List<SaleTargetInfoVO> result = new ArrayList<SaleTargetInfoVO>();
try {
result = (List<SaleTargetInfoVO>) queryBS.executeQuery(sql, sqlParam, new BeanListProcessor(SaleTargetInfoVO.class));
} catch (BusinessException e) {
e.printStackTrace();
}
return result;
}
}
package nc.pubitf.api.rest.occ;
public class SaleTargetInfoVO {
/**
* 统一设定下级销售组织指标值
*/
private String blowsetflag;
/**
* 开始日期
*/
private String dbegindate;
/**
* 结束日期
*/
private String denddate;
/**
* 指标设定周期
*/
private String fcyclesetflag;
/**
* 指标维护表头设置
*/
private String fheadshowflag;
/**
* 指标维护方式
*/
private String fmaintainflag;
/**
* 物料指标设定方式
*/
private String fmarsetflag;
/**
* 年度
*/
private String fyearflag;
/**
* 集团
*/
private String pk_group;
/**
* 销售组织
*/
private String pk_org;
/**
* 指标设置主实体
*/
private String pk_target;
/**
* 销售指标表编号
*/
private String VCODE = "vcode";
/**
* 销售指标表名称
*/
private String vname;
/**
* 备注
*/
private String vnote;
public String getBlowsetflag() {
return blowsetflag;
}
public void setBlowsetflag(String blowsetflag) {
this.blowsetflag = blowsetflag;
}
public String getDbegindate() {
return dbegindate;
}
public void setDbegindate(String dbegindate) {
this.dbegindate = dbegindate;
}
public String getDenddate() {
return denddate;
}
public void setDenddate(String denddate) {
this.denddate = denddate;
}
public String getFcyclesetflag() {
return fcyclesetflag;
}
public void setFcyclesetflag(String fcyclesetflag) {
this.fcyclesetflag = fcyclesetflag;
}
public String getFheadshowflag() {
return fheadshowflag;
}
public void setFheadshowflag(String fheadshowflag) {
this.fheadshowflag = fheadshowflag;
}
public String getFmaintainflag() {
return fmaintainflag;
}
public void setFmaintainflag(String fmaintainflag) {
this.fmaintainflag = fmaintainflag;
}
public String getFmarsetflag() {
return fmarsetflag;
}
public void setFmarsetflag(String fmarsetflag) {
this.fmarsetflag = fmarsetflag;
}
public String getFyearflag() {
return fyearflag;
}
public void setFyearflag(String fyearflag) {
this.fyearflag = fyearflag;
}
public String getPk_group() {
return pk_group;
}
public void setPk_group(String pk_group) {
this.pk_group = pk_group;
}
public String getPk_org() {
return pk_org;
}
public void setPk_org(String pk_org) {
this.pk_org = pk_org;
}
public String getPk_target() {
return pk_target;
}
public void setPk_target(String pk_target) {
this.pk_target = pk_target;
}
public String getVCODE() {
return VCODE;
}
public void setVCODE(String vCODE) {
VCODE = vCODE;
}
public String getVname() {
return vname;
}
public void setVname(String vname) {
this.vname = vname;
}
public String getVnote() {
return vnote;
}
public void setVnote(String vnote) {
this.vnote = vnote;
}
}
package nc.pubitf.api.rest.base;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import javax.validation.constraints.NotNull;
import org.apache.commons.lang.StringUtils;
import nc.vo.pub.BusinessException;
/**
* Restful请求参数基类
*
* @author tangxyc
*
*/
public class BaseRequestParam {
/**
* 通过反射将字段上标识了@NotNull注解的值进行是否为空判断,如果为空则抛出异常
*
* @throws Exception
*/
public void checkParamIsNull() throws Exception {
Field[] fields = this.getClass().getDeclaredFields();
for (Field field : fields) {
boolean isNotNull = field.isAnnotationPresent(NotNull.class);
Object fieldValue = getFieldValue(field);
if (isNotNull
&& (fieldValue == null
|| (fieldValue instanceof String && StringUtils
.isBlank((String) fieldValue)) || (fieldValue instanceof Collection
&& ((Collection) fieldValue).isEmpty()))) {
NotNull notNull = field.getAnnotation(NotNull.class);
throw new BusinessException(notNull.message());
}
}
}
/**
* 通过字段的get方法获取字段值
*
* @param field
* @return
* @throws Exception
*/
private Object getFieldValue(Field field) throws Exception {
Method[] methods = this.getClass().getDeclaredMethods();
for (Method method : methods) {
String methodName = method.getName();
// 通过属性的get方法获取属性值
if (methodName.startsWith("get")
&& methodName.substring(3, methodName.length())
.toLowerCase()
.equals(field.getName().toLowerCase())) {
try {
return method.invoke(this);
} catch (IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
throw new Exception("属性" + field.getName() + "的get方法调用异常: "
+ e.getMessage());
}
}
}
return null;
}
}
package nc.pubitf.api.rest.occ;
import javax.validation.constraints.NotNull;
import nc.pubitf.api.rest.base.BaseRequestParam;
/**
* 根据组织编码查询销售指标
*
* @author
*
*/
public class QuerySaleTargetInfoRequestParam extends BaseRequestParam {
@NotNull(message = "组织PK不能为空")
private String pkOrg;
private String orgCode;
private String customerCodes;
public String getPkOrg() {
return pkOrg;
}
public void setPkOrg(String pkOrg) {
this.pkOrg = pkOrg;
}
public String getOrgCode() {
return orgCode;
}
public void setOrgCode(String orgCode) {
this.orgCode = orgCode;
}
public String getCustomerCodes() {
return customerCodes;
}
public void setCustomerCodes(String customerCodes) {
this.customerCodes = customerCodes;
}
}
- 部署和测试
将上面的代码部署到bc模块后,重启中间件,Postman测试时,测试URL设置为:http://ip:port/uapws/rest/hanhoobc/occ/sale-target-info,其中/hanhoobc/occ为代码中的类声明中的Path值,而/sale-target-info是方法中的Path指,uapws/rest/为固定的NC65中的REST服务访问路径。Postman中设置请求方式为“POST”,请求HEAD参数Content-Type为application/json即可。效果如下:
开发环境调试,可能需要加上项目工程名,如地址“http://127.0.0.1/uapws/rest/NC_project_code/baseInfoRest/getOrgInfo”中的“NC_project_code”就是开发环境的项目工程名
注意:调试的时候,需要配置自变量,即添加uapws模块(已添加的忽略),不然调试没反应,我看了网上很多资料都没有说这一点,毕竟还是大多数人都是不熟悉这些东西的。配置如图:
NC中可以通过/uapws/service查看SOAP协议的接口的部署情况,REST协议的实际也有一个查看REST接口的serverlet,地址为uapws/restmanage,如下图,通过这个地址可以查看已经部署的REST接口清单以及接口所属的模块: