该框架使用极其简单

自动核查

版本: >= 1.6.1
在1.6.1版本中添加了@EnableMikilin注解,使用该注解则自动启用扫描

  1. // 添加注解
  2. @EnableMikilin
  3. @SpringBootApplication
  4. public class TestApplication {
  5. public static void main(String... args) {
  6. SpringApplication.run(TestApplication.class, args);
  7. }
  8. }

使用

使用@AuthCheck,如果修饰类,则类中的所有方法中的参数都会核查,如果修饰方法,则方法中的参数都会核查

  1. // 添加注解
  2. @AutoCheck
  3. @RequestMapping("${api-prefix}/table/config")
  4. @RestController
  5. public class TableConfigController {
  6. @Autowired
  7. private TableConfigService tableConfigService;
  8. /**
  9. * 应用总览
  10. */
  11. @ApiOperation(value = "应用总览")
  12. @PostMapping("overview")
  13. public AppOverviewRsp getAppOverview(@RequestBody AppManagerUpdateReq appManagerUpdateReq) {
  14. return appManagerService.getAppOverviewForShow(appManagerUpdateReq.getProfile(), appManagerUpdateReq.getAppId(), appManagerUpdateReq.getGroup());
  15. }
  16. ...
  17. }

对应的参数可以使用注解@Matcher

@Data
public class AppManagerUpdateReq {

    /**
     * 服务id
     */
    @ApiModelProperty(value = "服务id", example = "213234")
    // 使用注解
    @Matcher(customize = "com.isyscore.os.config.service.AppManagerService#existAppId", errMsg = "appId:#current 不存在")
    private Long id;
    /**
     * 应用名
     */
    @ApiModelProperty(value = "应用名", example = "isc-xxx")
    // 使用注解
    @Matcher(range = "[0, 32]")
    private String appName;

    /**
     * 应用描述
     */
    @ApiModelProperty(value = "应用描述", example = "描述xxx")
    // 使用注解
    @Matcher(notNull = "false", range = "[0, 256]")
    private String appDesc;

    /**
     * 激活状态:0未激活,1激活
     */
    @ApiModelProperty(value = "激活状态:0未激活,1激活", example = "1")
    // 使用注解
    @Matcher(value = {"0", "1"})
    private Integer activeStatus;
}

手动核查

在一些业务场景汇总,我们并不是spring-web项目,这个时候核查的话,可以通过硬编码的方式处理。这里提供了静态类 MkValidators,全部静态方法如下两个,其他的都是重载

/**
* 核查对象
*/
public boolean check(Object object){}
/**
* 核查对象的某些属性
*/
public boolean check(Object object, String... fieldSet){}
/**
* 根据分组核查属性
*/
public boolean check(String group, Object object) {}
/**
* 核查分组中的对象的某些属性
*/
public boolean check(String group, Object object, String... fieldSet){}
/**
* 返回错误信息链
*/
public String getErrMsgChain() {}
/**
* 获取最后设置错误信息
*/
public String getErrMsg() {}

/**
 * 核查对象失败抛异常
 */
public void validate(Object object) throws MkException

/**
 * 核查对象指定属性失败抛异常
 */
public void validate(Object object, String ...fieldSet) throws MkException

/**
 * 根据组核查对象失败抛异常
 */
public void validate(String group, Object object) throws MkException

/**
 * 根据组核查对象指定属性失败抛异常
 */
public void validate(String group, Object object, String ...fieldSet) throws MkException

示例:

如下:给需要拦截的属性添加注解即可

@Data
@Accessors(chain = true)
public class WhiteAEntity {

    // 修饰属性name,只允许对应的值为a,b,c和null
    @Matcher(value = {"a","b","c","null"}, errMsg = "输入的值 #current 不符合需求")
    private String name;
    private String address;
}

手动编写

import lombok.SneakyThrows;

@Test
@SneakyThrows
public void test1(){
    WhiteAEntity whiteAEntity = new WhiteAEntity();
    whiteAEntity.setName("d");
    // 可以使用带有返回值的核查
    if (!MkValidators.check(whiteAEntity)) {
        // 输出:数据校验失败-->属性 name 的值 d 不在只可用列表 [null, a, b, c] 中-->类型 WhiteAEntity 核查失败
        System.out.println(MkValidators.getErrMsgChain());
        // 输出:输入的值不符合需求
        System.out.println(MkValidators.getErrMsg());
    }
    // 或者 可以采用抛异常的核查,该api为 MkValidators.check 的带有异常的检测方式
    MkValidators.validate(whiteAEntity);
}

说明:

自动核查代码更简单,但是采用的是反射获取controller(或者说是注解 @AutoCheck 修饰的类和函数),在qps达到1000之后,性能较手动编写核查会下降,原因可以去看反射对性能的影响。后续有考虑将对应的类的核查函数在编译器生成,目前还在设计中