Solon详解(六)-|Solon详解(六)- 定制业务级别的验证注解
Solon详解系列文章:在业务的实现过程中,尤其是对外接口开发,我们需要对请求进行大量的验证并返回错误状态码和描述。lombok 框架有很多很赞的注解,但是人家是throw一个异常,这与有些需求不一定能匹配。
Solon详解(一)- 快速入门
Solon详解(二)- Solon的核心
Solon详解(三)- Solon的web开发
Solon详解(四)- Solon的事务传播机制
Solon详解(五)- Solon扩展机制之Solon Plugin
Solon详解(六)- 定制业务级别的验证注解
该文将基于Solon的一些扩展基础,简单的实现一套定制的业务验证机制。效果如下:
@XController
public class UserController extends VerifyController{
@RepeatSubmit//重复提交验证
@Whitelist//IP白名单验证
@NotNull({"name", "mobile", "icon", "code"})//非NULL验证
public void addUser(UserModel user){
//...
}
}
一、定制开始
1、先定义一组验证注解
@Inherited
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface NotNull {
String[] value();
}@Inherited
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Whitelist {
}//... 更多略
2、然后,定义一个验证用的拦截器
//
//Solon里的所有拦截器,也都是 XHandler
//
public class VerifyInterceptor implements XHandler {
@Override
public void handle(XContext ctx) throws Throwable {
//获取上下文中的XAction
//
XAction action = ctx.attr("action");
if (action != null) {
handle0(ctx, action);
}
}protected void handle0(XContext ctx, XAction action) throws Throwable {
//这里的顺序,要与业务的期望顺序匹配//白名单
checkWhitelist(ctx, action);
//不能为Null
checkNotNull(ctx, action);
//...更多略
}protected void checkWhitelist(XContext ctx, XAction action)throws Throwable{
if(ctx.getHandled()){
return;
}Whitelist anno = action.method().getAnnotation(Whitelist.class);
if (anno != null) {
String ip = IpUtils.getIP(ctx);
if (WhitelistApi.existsOfServerIp(ip) == false) {
ctx.setHandled(true);
ctx.render(UapiCodes.CODE_16);
}
}
}protected void checkNotNull(XContext ctx, XAction action)throws Throwable{
if(ctx.getHandled()){
return;
}NotNull anno = action.method().getAnnotation(NotNull.class);
if (anno != null) {
checkParamsIsOk(ctx, false, anno.value());
}
}
}
3、再是,定义一个支持验证的控制器基类
//
// 创建一个有验证拦截器的基类;@XBefore 注解是可继承的...
//
@XBefore({VerifyInterceptor.class})
public class VerifyController {}
完工了
二、附:关于 XContext 的部分扩展属性
Solon 的上下文对象:XContext,有一组可扩展属性的接口:attr(), attrSet(), attrMap()。用于记录处理过程中的数据或对象。
【Solon详解(六)-|Solon详解(六)- 定制业务级别的验证注解】以下是框架在运行过程中已记录的扩展属性:
扩展属性 | 说明 |
---|---|
ctx.attr("controller") | 获取当前控制器 |
ctx.attr("action") | 获取当前活动 |
ctx.result | 获取当前活动的执行结果,可用于统一的业务日志记录 |
ctx.attr("error") | 获取当前错误 |
ctx.attr("output") | 获取当前序列化输出,可用于统一的业务日志记录 |
推荐阅读
- 任时光绽放成六月繁花
- 赢在人生六项精进二阶Day3复盘
- 财商智慧课(六)
- 六步搭建ES6语法环境
- Java|Java OpenCV图像处理之SIFT角点检测详解
- C语言浮点函数中的modf和fmod详解
- 六月更新的......
- 六一礼物
- 六项精进20180530
- 2018年8月25日|2018年8月25日 星期六 晴 亲子日记第259篇