上面都是系统内置的一些匹配,如果用户想自定义匹配,可以自行扩展,需要通过该函数指定一个全限定名的类和函数指定即可,目前支持的参数类型有如下几种,比如

自定义函数路径匹配

  1. @Data
  2. @Accessors(chain = true)
  3. public class JudgeEntity {
  4. /**
  5. * 外部定义的匹配器,只传入属性的参数
  6. */
  7. @Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#ageValid")
  8. private Integer age;
  9. /**
  10. * 外部定义的匹配器,传入属性所在对象本身,也可传入属性的参数类型
  11. */
  12. @Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#ratioJudge")
  13. private Float mRatio;
  14. private Float nRatio;
  15. /**
  16. * 这里自定义的第一个参数是属性本身,第二个参数是框架的上下文(用户填充匹配成功或者失败的信息)
  17. */
  18. @Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#twoParam")
  19. private String twoPa;
  20. /**
  21. * 这里自定义的第一个参数是属性所在对象,第二个是属性本身,第三个参数是框架的上下文(用户填充匹配成功或者失败的信息)
  22. */
  23. @Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#threeParam")
  24. private String threePa;
  25. }

对应的匹配逻辑,其中匹配函数的入参是上面注解修饰的属性的类型(或者子类),参数类型只能是属性对应类型、属性所在对象类型或者MkConstext类型三种

注意:

version:>=v1.6.1
类型三种,顺序没有要求

verion:< v1.6.1
类型三种,顺序是有要求的,对应的顺序可见如下

public class CustomizeCheck {

    /**
     * 年龄是否合法
     */
    public boolean ageValid(Integer age) {
        if(null == age){
            return false;
        }
        if (age >= 0 && age < 200) {
            return true;
        }

        return false;
    }

    /**
     * 能够传递核查的对象,对于对象中的一些属性可以进行系统内部的配置
     *
     * mRatio + nRatio < 1.0
     */
    private boolean ratioJudge(JudgeEntity judgeEntity, Float nRatio) {
        if(null == nRatio || null == judgeEntity){
            return false;
        }
        return nRatio + judgeEntity.getMRatio() < 10.0f;
    }

    /**
     * 两个函数
     */
    private boolean twoParam(String funName, MkContext context) {
        if (funName.equals("hello")){
            context.append("匹配上字段'hello'");
           return true;
        }
        context.append("没有匹配上字段'hello'");
        return false;
    }

    /**
     * 三个函数
     * version:>= 1.6.1时候,所有参数顺序和个数都是可以随意,只要满足三种类型即可
     */
    private boolean threeParam(JudgeEntity judgeEntity, String temK, MkContext context) {
        if (temK.equals("hello") || temK.equals("word")){
            context.append("匹配上字段'hello'和'word'");
            return true;
        }
        context.append("没有匹配上字段'hello'和'word'");
        return false;
    }
}

spring的Bean自定义匹配器

上面看到了,我们指定一个全限定路径即可设置过滤器,其实是反射了一个代理类,在真实的业务场景中,我们的bean是用spring进行管理的,因此这里增加了一个通过spring管理的匹配器,如下 使用时候需要在指定为扫描一下如下路径即可

@ComponentScan(value = “com.simonalong.mikilin.util”) 或者在能扫描到的位置添加如下即可 @Import({SpringBeanUtils.class})

@Import({MkSpringBeanContext.class})
@Configuration
public class MkConfiguration {
}

注意:
目前在版本v1.6.0中,对SpringBeanUtils弃用,修改名为MkSpringBeanContext,后续版本中会慢慢下掉

下面的函数对应的参数跟上面非spring时候一样,可以有三种格式

@Service
public class JudgeCls {

    // 该引用只是举例
    @Autowire
    private UserSevice userSevice;

    /**
     * 地址匹配
     */
    private boolean addressInvalid(String address){
        if(null == address){
            return true;
        }
        List<String> blackList = Arrays.asList("beijing", "hangzhou");
        if (blackList.contains(address)) {
            return true;
        }
        return false;
    }

    /**
     * 能够传递核查的对象,对于对象中的一些属性可以进行系统内部的配置
     *
     * mRatio + nRatio < 1.0
     */
    private boolean ratioJudge(CustomizeEntity customizeEntity, Float nRatio) {
        if(null == nRatio || null == customizeEntity){
            return false;
        }
        return nRatio + customizeEntity.getMRatio() < 10.0f;
    }

    /**
     * 两个函数
     */
    private boolean twoParam(String funName, MkContext context) {
        if (funName.equals("hello")){
            context.append("匹配上字段'hello'");
           return true;
        }
        context.append("没有匹配上字段'hello'");
        return false;
    }

    private boolean fieldErrMsgMatch(String fieldErrMsg, MkContext mkContext) {
        if (fieldErrMsg.contains("mock")) {
            mkContext.setLastErrMsg("当前的值命中黑名单");
            return true;
        } else {
            mkContext.setLastErrMsg("当前的值不符合需求");
            return false;
        }
    }

    /**
     * 三个函数
     */
    private boolean threeParam(CustomizeEntity customizeEntity, String temK, MkContext context) {
        if (temK.equals("hello") || temK.equals("word")){
            context.append("匹配上字段'hello'和'word'");
            return true;
        }
        context.append("没有匹配上字段'hello'和'word'");
        return false;
    }
}