下面这个场景是特意为此文设计出来的,有点儿乱。但凡类似的场景。。。Solon 都可以给你一个so easy的支持。

Solon 特性之一:

可让控制器实现 Render,从而接管控制器的渲染动作。

1、定义个接口基类,并实现渲染接口

渲染逻辑如下:

  1. 如果对象是null,跳过不管
  2. 如果是String,直接输出
  3. 如果是ONode,做为Json输出
  4. 如果是UapiCode,将其转为Result,再序列化为Json输出
  5. 如果是Throwable,将其转为Result,再序列化为Json输出
  6. 如果是其它数据,直接序列化为Json输出

代码:

//这个注解可继承,用于支持子类的验证
//
@Valid
public class UapiBase implements Render {
@Override
public void render(Object obj, Context ctx) throws Throwable {
if (obj == null) {
return;
} if (obj instanceof String) {
ctx.output((String) obj);
} else {
if (obj instanceof ONode) {
ctx.outputAsJson(((ONode) obj).toJson());
} else {
if (obj instanceof UapiCode) {
//此处是重点,把一些特别的类型进行标准化转换
//
UapiCode err = (UapiCode) obj;
obj = XResult.failure(err.getCode(), UapiCodes.getDescription(err));
} if (obj instanceof Throwable) {
//此处是重点,把异常进行标准化转换
//
Throwable err = (Throwable) obj;
obj = XResult.failure(err.getMessage());
} ctx.outputAsJson(ONode.stringify(obj));
}
}
}
}

2、接口基类应用示例

示例,白名单检测接口

此接口做个白名单检测。如果成功,则返加符串:OK

@Controller
public class CMD_run_whitelist_check extends UapiBase {
//此处的@NotEmpty验证,如果没通过会抛出UapiCode
@NotEmpty({"type", "value"})
@Mapping("/run/whitelist/check/")
public String cmd_exec(Context ctx, String type, String value) throws Exception {
String tags = ctx.param("tags", ""); if (tags.contains("client")) {
if (DbWaterCfgApi.whitelistIgnoreClient()) {
return "OK";
}
} if (DbWaterCfgApi.isWhitelist(tags, type, value)) {
return ("OK");
} else {
return (value + ",not is whitelist!");
}
}
}

示例,通知推送接口

此接口只能白名单里的IP方可调用。执行后返回:Result

//此处的@Whitelist验证,如果没通过会抛出UapiCode
@Whitelist
@Controller
public class CMD_run_push extends UapiBase {
//此处的@NotEmpty验证,如果没通过会抛出UapiCode
@NotEmpty({"msg", "target"})
@Mapping("/run/push/")
public Result cmd_exec(String msg, String target) throws Exception { List<String> list = new ArrayList<String>();
for (String str : target.split(",")) {
if (str.equals("@alarm")) {
List<String> mobiles = DbWaterCfgApi.getAlarmMobiles(); list.addAll(mobiles);
} else {
list.add(str);
}
} String rest = ProtocolHub.heihei.push(Config.water_service_name, list, msg); if (TextUtils.isEmpty(rest) == false) {
return Result.succeed(ONode.load(rest));
} else {
return Result.failure();
}
}
}

示例,配置获取接口

此接口返回一组配置,以ONode类型返回

//@Logging是个拦截器,会对请求输入进行记录
@Logging
//此处的@Whitelist验证,如果没通过会抛出UapiCode
@Whitelist
@Controller
public class CMD_cfg_get extends UapiBase {
//此处的@NotEmpty验证,如果没通过会抛出UapiCode
@NotEmpty("tag")
@Mapping("/cfg/get/")
public ONode cmd_exec(Context ctx, String tag) throws Throwable {
ONode nList = new ONode().asObject(); if (TextUtils.isEmpty(tag) == false) {
List<ConfigModel> list = DbWaterCfgApi.getConfigByTag(tag); Date def_time = new Date(); for (ConfigModel m1 : list) {
if (m1.update_fulltime == null) {
m1.update_fulltime = def_time;
} ONode n = nList.getNew(m1.key);
n.set("key", m1.key);
n.set("value", m1.value); if (m1.update_fulltime == null) {
n.set("lastModified", 0);
} else {
n.set("lastModified", m1.update_fulltime.getTime());
}
}
} return nList;
}
}

此文的渲染控制重点是对抛出来的UapiCode和Throwable,进行有效的控制并以统一的Result形态输出。对外接口开发时,还是效果可期的。当然,也可以用此特性干点别的什么事儿。

Solon Web 开发,十二、统一的渲染控制的更多相关文章

  1. Solon Web 开发,二、开发知识准备

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  2. Solon Web 开发,十四、与Spring、Jsr330的常用注解对比

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  3. Solon Web 开发

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  4. Solon Web 开发,一、开始

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  5. Solon Web 开发,四、请求上下文

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  6. Solon Web 开发,五、数据访问、事务与缓存应用

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. Solon Web 开发,六、过滤器、处理、拦截器

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  8. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  9. Solon Web 开发,八、校验、及定制与扩展

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

随机推荐

  1. AtCoder Beginner Contest 173 题解

    AtCoder Beginner Contest 173 题解 目录 AtCoder Beginner Contest 173 题解 A - Payment B - Judge Status Summ ...

  2. 洛谷八月月赛 II T2 题解

    Content 现有 \(T\) 次询问. 每次询问给定一个长度为 \(n\) 的 01 串,记为 \(A\).回答应是一个字符串 \(B\),满足: \(B\) 是长度为 \(m\) 的 01 串. ...

  3. python3 迭代器&生成器

    前戏:列表生成式 等于 用列表生成式生成列表.需要将所有数据生成到内存中,占用空间,如果数据太多.生成数据就会耗时较久. 例如需要运行卡顿一下..... 定义一个生成器:定义时不生成任何数据,只有通过 ...

  4. MySQL增删改查的常用语句汇总

    MySQL增删改查的常用语句汇总 以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop da ...

  5. 前端实现list排序

    需求 针对list中某个字段,实现list的升序和降序 效果图 代码 我是用在angular1.X中项目的,根据list中的sort字段进行排序. # sort.html <style> ...

  6. npm ERR! Error: EPERM: operation not permitted

    转载于:https://blog.csdn.net/qq_36772866/article/details/86934950 win10 在npm install时报错 解决方案 删除node-mou ...

  7. windows系统中远程登录ubuntu18服务器的桌面

    下载:http://www.c-nergy.be/products.html 也可以直接服务器里 wget https://www.c-nergy.be/downloads/xRDP/xrdp-ins ...

  8. IDEA启动报错:Error:java: Compilation failed: internal java compiler error

    检查是否一致

  9. ubuntu下AF_INET和AF_INET6的值

    关于 演示环境 $ uname -a Linux xxxxxxx 5.4.0-47-generic #51-Ubuntu SMP Fri Sep 4 19:50:52 UTC 2020 x86_64 ...

  10. 【九度OJ】题目1056:最大公约数 解题报告

    [九度OJ]题目1056:最大公约数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1056 题目描述: 输入两个正整数,求 ...