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 的项目?html
下面这个场景是特地为此文设计出来的。万一有相似的出现了。。。Springboot mini -Solon 能够给你一个so easy的支持。java
Solon 特性之一:git
可以让控制器实现 Render,从而接管控制器的渲染动做。github
渲染逻辑以下:web
代码:api
//这个注解可继承,用于支持子类的验证 // @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)); } } } }
此接口作个白名单检测。若是成功,则返加符串: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方可调用。执行后返回:Resultapp
//此处的@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形态输出。对外接口开发时,仍是效果可期的。固然,也能够用此特性干点别的什么事儿。jsp