自定义注解:实现枚举校验,组合条件校验

判空注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NullCheckValidate {

    String message() default "字段不能为空";
}

枚举注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EnumCheckValidate {

    Class enumClass();

    String message() default "类型不匹配";

}

枚举继承接口

public interface EnumInterface {

    String getEnumObj();
}

 

组合条件校验

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface GroupCheckValidate {
    /**
     * 当requst.get(key)=values时,验证
     */

    String key();

    String value();

    boolean isList();

    boolean isObject();

    String message() default "类型不匹配";

}

实现

    public static CommonResultResp validatorCheck(Object request) {
        CommonResultResp result = new CommonResultResp();

        Class c = request.getClass();
        Field[] fields = c.getDeclaredFields();
        for (Field fie : fields) {
            try {
                fie.setAccessible(true);
                /**
                 * 非空校验
                 */
                NullCheckValidate nullCheckValidate = fie.getAnnotation(NullCheckValidate.class);
                if (nullCheckValidate != null) {
                    if (StringUtils.isEmpty(fie.get(request))) {
                        result.setResultCode(OmsCommonConsts.RESULE_CODE_FAIL);
                        result.setResultMsg(nullCheckValidate.message());
                        return result;
                    }
                    continue;
                }

                /**
                 * 组合校验
                 */
                GroupCheckValidate groupCheckValidate = fie.getAnnotation(GroupCheckValidate.class);
                if (groupCheckValidate != null) {
                    Field value = c.getDeclaredField(groupCheckValidate.key());
                    value.setAccessible(true);
                    if (value == null || StringUtils.isEmpty(value.get(request))) {
                        value.setAccessible(false);
                        result.setResultCode(OmsCommonConsts.RESULE_CODE_FAIL);
                        result.setResultMsg(groupCheckValidate.message());
                        return result;
                    }
                    boolean groupV = checkByGroup(fie, request, value.get(request).toString(), groupCheckValidate);
                    value.setAccessible(false);
                    if (!groupV) {
                        result.setResultCode(OmsCommonConsts.RESULE_CODE_FAIL);
                        result.setResultMsg(groupCheckValidate.message());
                        return result;
                    }
                }

                /**
                 * 枚举校验
                 */
                EnumCheckValidate enumCheckValidate = fie.getAnnotation(EnumCheckValidate.class);
                if (enumCheckValidate != null) {
                    boolean enumV = checkByEnum(fie, request, enumCheckValidate.enumClass().getName());
                    if (!enumV) {
                        result.setResultCode(OmsCommonConsts.RESULE_CODE_FAIL);
                        result.setResultMsg(enumCheckValidate.message());
                        return result;
                    }
                    continue;
                }
                fie.setAccessible(false);
            } catch (Exception e) {
                fie.setAccessible(false);
                e.printStackTrace();
                result.setResultCode(OmsCommonConsts.RESULE_CODE_FAIL);
                result.setResultMsg("参数校验解析解析异常 code=" + fie.getName());
                return result;
            }
        }
        result.setResultCode(OmsCommonConsts.RESULE_CODE_SUCCESS);
        result.setResultMsg("参数校验通过");
        return result;

    }

    private static boolean checkByEnum(Field field, Object request, String className) throws Exception {
        if (StringUtils.isEmpty(field.get(request))) {
            return false;
        }
        Class<?> onwClass = null;
        String value = field.get(request).toString();
        onwClass = Class.forName(className);
        Method method = onwClass.getMethod("values");
        EnumInterface[] inter = (EnumInterface[]) method.invoke(null);
        for (EnumInterface enumMessage : inter) {
            String object = enumMessage.getEnumObj();
            if (value.equals(object)) {
                return true;
            }
        }
        return false;
    }

    private static boolean checkByGroup(Field field, Object request, String paramsValue, GroupCheckValidate groupCheckValidate) throws Exception {

        if (!paramsValue.equals(groupCheckValidate.value())) {
            return true;
        }
        Object o = field.get(request);
        if (groupCheckValidate.isList()) {
            if (CollectionUtils.isEmpty((Collection<?>) o)) {
                return false;
            }
        } else {
            if (o == null) {
                return false;
            }
        }

        return true;
    }

需要判断的类

/**
     * 购买方式
     */
    @ApiModelProperty(value = "【必填】下单类型:购物车:GWCGM,立即购买:LJGM")
  @NullCheckValidate    
private String sourceType;
    @ApiModelProperty(value = "【立即购买必填】商品列表")
    @GroupCheckValidate(key = "sourceType", value = "LJGM", isList = true, isObject = false, message = "goodsItem 立即购买必填")
    private List<OrderGoodsItemDTO> goodsItem;

    /**
     * 物流信息
     */
    @ApiModelProperty(value = "【必填】 配发方式")
    @EnumCheckValidate(enumClass = OrderShipType.class, message = "shipType 类型不匹配,请参考文档")
    private String shipType;

调用

 /**
         * 参数校验
         */
        CommonResultResp resp = Utils.validatorCheck(request);
        if (!resp.isSuccess()) {
            resp.setResultCode(resp.getResultCode());
            resp.setResultMsg(resp.getResultMsg());
            return resp;
        }

 

posted @ 2019-01-16 16:01  千古丶风流人物  阅读(2380)  评论(0编辑  收藏  举报