NC65实现Restful接口开发及调试

  1. 在nchome中的modules里对应的业务模块的META-INF中添加 occ.rest文件,开发项目中也是在项目对应的META-INF下,如图:
    NC65实现Restful接口开发及调试_第1张图片

NC65实现Restful接口开发及调试_第2张图片
在模块的META-INF文件夹下,增加occ.rest扩展名的接口文件,内容为xml格式,参考脚本如下:

<?xml version="1.0" encoding='gb2312'?>
<module>
	<rest>
		<resource classname="nc.pubitf.api.rest.occ.SaleTargetRestResource"  exinfo=""/>
	</rest>
</module>
  1. 在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;
	}

}

  1. 部署和测试

将上面的代码部署到dm模块后,重启中间件,Postman测试时,测试URL设置为:http://ip:port/uapws/rest/occ/query/sale-target-info,其中occ/query/sale-target-info为代码中的类声明中的Path和方法中的Path,uapws/rest/为固定的NC65中的REST服务访问路径。Postman中设置请求方式为“POST”,请求HEAD参数Content-Type为application/json即可。效果如下:
NC65实现Restful接口开发及调试_第3张图片
注意:调试的时候,需要配置自变量,即添加uapws模块(已添加的忽略),不然调试没反应,我看了网上很多资料都没有说这一点,毕竟还是大多数人都是不熟悉这些东西的。配置如图:
NC65实现Restful接口开发及调试_第4张图片

NC65实现Restful接口开发及调试_第5张图片

NC中可以通过/uapws/service查看SOAP协议的接口的部署情况,REST协议的实际也有一个查看REST接口的serverlet,地址为uapws/restmanage,如下图,通过这个地址可以查看已经部署的REST接口清单以及接口所属的模块:
NC65实现Restful接口开发及调试_第6张图片

你可能感兴趣的:(NC,restful,java,后端)