Javaアノテーション(特定のnull属性名と中国語の解釈を取得するために使用)

必要なパラメータの検証時にスローされるエラーメッセージが明確でないため、検証が必要なパラメータ値がエンティティクラスにインスタンス化され、このエンティティクラスの属性が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()方法就可以了。

 

おすすめ

転載: blog.csdn.net/zhangwenchao0814/article/details/108670007