Springboot min -Solon 详解系列文章:

Springboot mini - Solon详解(一)- 快速入门

Springboot mini - Solon详解(二)- Solon的核心

Springboot mini - Solon详解(三)- Solon的web开发

Springboot mini - Solon详解(四)- Solon的事务传播机制

Springboot mini - Solon详解(五)- Solon扩展机制之Solon Plugin

Springboot mini - Solon详解(六)- Solon的校验框架使用、定制与扩展

Springboot mini - Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330

Springboot mini - Solon详解(八)- Solon的缓存框架使用和定制

Springboot mini - Solon详解(九)- 渲染控制之定制统一的接口输出

Springboot mini - Solon详解(十)- 怎么用 Solon 开发基于 undertow jsp tld 的项目?

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

Solon 特性之一:

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

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

渲染逻辑如下:

  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));
}
}
}
}

二、接口示例

1. 白名单接口

此接口做个白名单检测。如果成功,则返加符串: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!");
}
}
}

2. 通知推送接口

此接口只能白名单里的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();
}
}
}

3. 配置获取接口

此接口返回一组配置,以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项目地址

Solon 框架详解(九)- 渲染控制之定制统一的接口输出的更多相关文章

  1. Solon详解(九)- 渲染控制之定制统一的接口输出

    Solon详解系列文章: Solon详解(一)- 快速入门 Solon详解(二)- Solon的核心 Solon详解(三)- Solon的web开发 Solon详解(四)- Solon的事务传播机制 ...

  2. Solon 框架详解(十一)- Solon Cloud 的配置说明

    Solon 详解系列文章: Solon 框架详解(一)- 快速入门 Solon 框架详解(二)- Solon的核心 Solon 框架详解(三)- Solon的web开发 Solon 框架详解(四)- ...

  3. Solon 框架详解(十)- Solon 的常用配置

    Springboot min -Solon 详解系列文章: Springboot mini - Solon详解(一)- 快速入门 Springboot mini - Solon详解(二)- Solon ...

  4. Spark2.1.0——内置Web框架详解

    Spark2.1.0——内置Web框架详解 任何系统都需要提供监控功能,否则在运行期间发生一些异常时,我们将会束手无策.也许有人说,可以增加日志来解决这个问题.日志只能解决你的程序逻辑在运行期的监控, ...

  5. mina框架详解

     转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...

  6. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  7. mapreduce框架详解

    hadoop 学习笔记:mapreduce框架详解 开始聊mapreduce,mapreduce是hadoop的计算框架,我学hadoop是从hive开始入手,再到hdfs,当我学习hdfs时候,就感 ...

  8. iOS 开发之照片框架详解

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...

  9. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

随机推荐

  1. 设计模式(二十二)——状态模式(APP抽奖活动+借贷平台源码剖析)

    24.1 APP 抽奖活动问题 请编写程序完成 APP 抽奖活动 具体要求如下: 1) 假如每参加一次这个活动要扣除用户 50 积分,中奖概率是 10% 2) 奖品数量固定,抽完就不能抽奖 3) 活动 ...

  2. woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序

    title: woj1019 Curriculum Schedule 输入输出 date: 2020-03-19 10:43:00 categories: acm tags: [acm,woj] 水题 ...

  3. Codeforces13C–Sequence (区间DP)

    题目大意 给定一个含有N个数的序列,要求你对一些数减掉或者加上某个值,使得序列变为非递减的,问你加减的值的总和最少是多少? 题解 一个很显然的结果就是,变化后的每一个值肯定是等于原来序列的某个值,因为 ...

  4. Leetcode(83)-删除排序链表中的重复元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  5. SPOJ - LCS2 Longest Common Substring II(后缀自动机)题解

    题意: 求\(n\)个串的最大\(LCS\). 思路: 把第一个串建后缀自动机,然后枚举所有串.对于每个串,求出这个串在\(i\)节点的最大匹配为\(temp[i]\)(当前串在这个节点最多取多少), ...

  6. HDU 4335 What is N?(指数循环节)题解

    题意: 询问有多少数\(n\)满足\(n^{n!}\equiv b\mod p \land\ n\in[1,M]\),数据范围:\(M\leq2^{64}-1,p\leq1e5\) 思路: 这题显然要 ...

  7. Clipboard API

    Clipboard API click copy click copy demo clickGetNewsLink(data_ref = `newsLink`) { let that = this; ...

  8. git commit guidelines

    git-commit-guidelines AngularJS Development Setup Running Tests Coding Rules Commit Message Guidelin ...

  9. React & Didact

    React & Didact A DIY guide to build your own React https://github.com/pomber/didact https://gith ...

  10. 市值达万亿?总量仅10万枚的VAST,先兑换先得!

    据了解,SPC第一轮.第二轮空投已经结束,两轮空投下来共发放了400万枚SPC.NGK所有算力持有者有效账户基本获得了SPC空投奖励,甚至有的NGK算力持有者获得了数千枚SPC. 而为了进一步奖励NG ...