自动核查
版本: >= 1.6.1
在1.6.1版本中添加了@EnableMikilin注解,使用该注解则自动启用扫描
// 添加注解
@EnableMikilin
@SpringBootApplication
public class TestApplication {
public static void main(String... args) {
SpringApplication.run(TestApplication.class, args);
}
}
使用
使用@AuthCheck,如果修饰类,则类中的所有方法中的参数都会核查,如果修饰方法,则方法中的参数都会核查
// 添加注解
@AutoCheck
@RequestMapping("${api-prefix}/table/config")
@RestController
public class TableConfigController {
@Autowired
private TableConfigService tableConfigService;
/**
* 应用总览
*/
@ApiOperation(value = "应用总览")
@PostMapping("overview")
public AppOverviewRsp getAppOverview(@RequestBody AppManagerUpdateReq appManagerUpdateReq) {
return appManagerService.getAppOverviewForShow(appManagerUpdateReq.getProfile(), appManagerUpdateReq.getAppId(), appManagerUpdateReq.getGroup());
}
...
}
对应的参数可以使用注解@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之后,性能较手动编写核查会下降,原因可以去看反射对性能的影响。后续有考虑将对应的类的核查函数在编译器生成,目前还在设计中