上面都是系统内置的一些匹配,如果用户想自定义匹配,可以自行扩展,需要通过该函数指定一个全限定名的类和函数指定即可,目前支持的参数类型有如下几种,比如
自定义函数路径匹配
@Data
@Accessors(chain = true)
public class JudgeEntity {
/**
* 外部定义的匹配器,只传入属性的参数
*/
@Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#ageValid")
private Integer age;
/**
* 外部定义的匹配器,传入属性所在对象本身,也可传入属性的参数类型
*/
@Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#ratioJudge")
private Float mRatio;
private Float nRatio;
/**
* 这里自定义的第一个参数是属性本身,第二个参数是框架的上下文(用户填充匹配成功或者失败的信息)
*/
@Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#twoParam")
private String twoPa;
/**
* 这里自定义的第一个参数是属性所在对象,第二个是属性本身,第三个参数是框架的上下文(用户填充匹配成功或者失败的信息)
*/
@Matcher(customize = "com.simonalong.mikilin.judge.JudgeCheck#threeParam")
private String threePa;
}
对应的匹配逻辑,其中匹配函数的入参是上面注解修饰的属性的类型(或者子类),参数类型只能是属性对应类型、属性所在对象类型或者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;
}
}