必要なパラメータの検証時にスローされるエラーメッセージが明確でないため、検証が必要なパラメータ値がエンティティクラスにインスタンス化され、このエンティティクラスの属性がnull以外の検証の反映によって取得されます(各タイプトランザクションは、パラメータ検証エンティティクラスを定義し、基本クラスを継承します。パラメータが空の場合、属性の名前と中国語の解釈を取得し、例外をスローします。
注解类:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ChkParam {
/**
* 检查参数属性名称
* @return
*/
public String name() default "";
/**
* 参数类型
* @return
*/
public String type() default "";
/**
* 备用字段
* @return
*/
public String dac() default "";
}
基类:
import java.io.Serializable;
/**
* 请求参数校验实体类基类
* @author: zhangwch
* @create: 2020-09-18 09:27
**/
public class BaseDO implements Serializable {
// 服务名
public String svcName;
public String getSvcName() {
return svcName;
}
public void setSvcName(String svcName) {
this.svcName = svcName;
}
@Override
public String toString() {
return "BaseDO{" +
"svcName='" + svcName + '\'' +
'}';
}
}
具体的交易参数实体类:
/**
* 数据交换平台http请求头参数实体类
* @author: zhangwch
* @create: 2020-09-18 09:20
**/
public class ReqParamDO extends BaseDO {
@ChkParam(name = "请求者标识")
private String sid;
@ChkParam(name = "服务编码")
private String rid;
@ChkParam(name = "签名")
private String sign;
public ReqParamDO() {
}
public ReqParamDO(String svrName, String sid, String rid, String sign) {
this.svcName = svrName;
this.sid = sid;
this.rid = rid;
this.sign = sign;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public String getRid() {
return rid;
}
public void setRid(String rid) {
this.rid = rid;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
@Override
public String toString() {
return "ReqParamDO{" +
", sid='" + sid + '\'' +
", rid='" + rid + '\'' +
", sign='" + sign + '\'' +
'}';
}
}
业务逻辑:
/**
* 参数校验
*
* @param baseDO
*/
public static void chkParam(BaseDO baseDO) throws IllegalAccessException {
Field[] fields = baseDO.getClass().getDeclaredFields();
for (Field field : fields) {
// 设置可以访问私有属性
field.setAccessible(true);
if (StringTool.isNullOrEmpty((String) field.get(baseDO))) {
String retErr = "必输参数";
// 如果是指定类型注解类型则返回true
if (field.isAnnotationPresent(ChkParam.class)) {
// 返回指定类型的元素的注释
ChkParam annotation = field.getAnnotation(ChkParam.class);
retErr = annotation.name() + "|" + field.getName();
}
System.out.println("必输参数校验失败[%s]不能为空", retErr);
throw new Exception("********", baseDO.getSvcName(), retErr);
}
}
System.out.println("必输参数校验通过");
}
调用:
PubUtil.chkParam(new ReqParamDO(svcName, sid, rid, sign));
以后若是有别的交易需要校验,直接新增一个请求参数校验实体类继承基类(BaseDO)然后调用PubUtil.chkParam()方法就可以了。