文档章节

Actframework中如何灵活控制JSON响应

罗格林
 罗格林
发布于 2017/02/17 08:59
字数 613
阅读 313
收藏 3
点赞 2
评论 4

@DiamondFsd 昨天写了一篇关于如何在Spring MVC中灵活控制JSON返回的博客,其中@JSON注解的思路和我在actframework的处理方式非常相似。

刚好昨天把actframework放上码云了,就这个话题写下 如何在ActFramework中控制JSON返回

首先是资源和服务。我将就@DiamondFsd的article的例子来做讲解

@Entity("article")
public class Article extends MorphiaAdaptiveRecord<Article> {

    @Controller("article")
    public static class Service extends MorphiaDao<Article> {

        @GetAction
        public Iterable<Article> list() {
            return findAll();
        }

        @GetAction("{id}")
        public Article show(String id) {
            return findById(id);
        }

        @PostAction
        public Article create(Article article) {
            return save(article);
        }
        ...
    }

}

这里我们看到可以通过 POST /article向服务提交article数据。假设我提交的数据是:

{
	"title": "How to control JSON view in Actframework",
	"content": "BlahBlah",
	"author": "Gelin Luo",
	"language": "Java",
	"framework": "Actframework",
	"tags" : [
		{"name": "java"},
		{"name": "mvc"},
		{"name": "json"}
	]
}

我可以得到类似下面的返回:

{
  "id": "58a6409ab6c6fe2138b67f10",
  "_created": "17/02/2017 11:15:22 AM",
  "content": "BlahBlah",
  "v": 1,
  "language": "Java",
  "author": "Gelin Luo",
  "title": "How to control JSON view in Actframework",
  "_modified": "17/02/2017 11:15:22 AM",
  "framework": "Actframework",
  "tags": [
    {
      "name": "java"
    },
    {
      "name": "mvc"
    },
    {
      "name": "json"
    }
  ]
}

当我发出GET /article请求时,Article.Service.list()方法会响应并返回所有的article列表:

[
  {
    "id": "58a6409ab6c6fe2138b67f10",
    "_created": "17/02/2017 11:15:22 AM",
    "content": "BlahBlah",
    "v": 1,
    "language": "Java",
    "author": "Gelin Luo",
    "title": "How to control JSON view in Actframework",
    "_modified": "17/02/2017 11:15:22 AM",
    "framework": "Actframework",
    "tags": [
      {
        "name": "java"
      },
      {
        "name": "mvc"
      },
      {
        "name": "json"
      }
    ]
  }
]

那如果我想控制返回列表的数据,让每项只返回authortitle,我可以在list()方法上面添加注解PropertySpec

@GetAction
@act.util.PropertySpec("author,title")
public Iterable<Article> list() {
    return findAll();
}

然后再发出GET /article请求,就可以得到下面的响应了:

[
  {
    "author": "Gelin Luo",
    "title": "How to control JSON view in Actframework"
  }
]

我可以在Article.Service.show(String)方法上采用类似的方法来定义需要返回的字段。有人提到过如果想让前端向后端在请求中传递需要的字段该怎么办,下面是Actframework提供的方法:

show(String)方法做一点改动

@GetAction("{id}")
public Article show(String id) {
    return findById(id);
}

变为

@GetAction("{id}")
public Article show(String id, String fields) {
    PropertySpec.current.set(fields);
    return findById(id);
}

然后就可以从前端在请求中加载fields参数了:

GET /article/58a6409ab6c6fe2138b67f10?fields=-tags,-content,-_created

上面的请求表示从返回JSON结果中去掉tags, content,和_created三个字段

返回结果将会是:

{
  "id": "58a6409ab6c6fe2138b67f10",
  "v": 1,
  "language": "Java",
  "author": "Gelin Luo",
  "title": "How to control JSON view in Actframework",
  "_modified": "17/02/2017 11:15:22 AM",
  "framework": "Actframework"
}

该博客的完整源码在码云

ActFramework: https://www.oschina.net/p/actframework

© 著作权归作者所有

共有 人打赏支持
罗格林

罗格林

粉丝 240
博文 38
码字总数 37360
作品 4
其他
架构师
加载中

评论(4)

罗格林
罗格林

引用来自“TonyLiu13”的评论

github 上面有一个类似的 jackson 插件跟这个思路很像: https://github.com/Antibrumm/jackson-antpathfilter

支持通配, 减(-), 级联

回复@TonyLiu13 : Act 的JSON支持建立在FastJSON上面的。不过是自己写的Path filter
TonyLiu13
TonyLiu13
github 上面有一个类似的 jackson 插件跟这个思路很像: https://github.com/Antibrumm/jackson-antpathfilter

支持通配, 减(-), 级联
罗格林
罗格林

引用来自“李嘉图”的评论

思路虽然相似,约定以后更灵活了,而且-号竟然是减去的意思:satisfied::satisfied:
除了减号,还能支持正则表达式用于复杂对象结构的情况:satisfied:
李嘉图
李嘉图
思路虽然相似,约定以后更灵活了,而且-号竟然是减去的意思:satisfied::satisfied:
Act-starter 1.8.8.0 强势发布 - 带来端到端自动化测试支持

Act-starter 1.8.8.0 是以 act-1.8.8-RC4 为核心的多个 starters 项目集合. 这个版本带来超过 40 项修改或增强: [act-e2e] 新的插件带来端到端自动化测试支持 [act-ebean]注册全局映射过滤器...

罗格林 ⋅ 05/14 ⋅ 0

Act starter 1.8.8.4 发布,更完善的 E2E 自动化测试方案

act-starters-1.8.8.4 基于最新的 act-1.8.8-RC8 版本, 提供了多个插件的更新, 包括: act-sql-common-1.4.0 act-jpa-common-1.4.0 act-ebean-1.7.0 act-ebean-java7-1.7.0 act-eclipselink-1......

罗格林 ⋅ 05/31 ⋅ 0

一场版本升级引发的性能血案 - 王者归来

上次老码农在一场版本升级引发的性能血案 - 之数据历险一文中讲得口吐白沫, 最后还是没有一个结果, 反而被 OSCer 们各种吐槽: "看得我快快精尽人亡了""看着一头雾水""一脸懵逼进来,一脸懵逼...

罗格林 ⋅ 06/04 ⋅ 0

ActFramework有意向做成微服务的框架吗

@罗格林 你好,想跟你请教个问题:ActFramework有意向做成微服务的框架吗

超级大黑猫 ⋅ 05/28 ⋅ 0

ActFramework-1.3.0 - 页面缓存,模板路径等多项更新

猛戳 此处 立刻查看激动人心的特性 ActFramework 是一个功能强大易用的 Java 全栈 Web 开发框架. 依托于 undertow 提供的网络层服务, ActFramework 摈弃了老式难用的 Servlet 框架, 并提供了...

罗格林 ⋅ 2017/05/03 ⋅ 9

Java MVC全栈框架--ActFramework

ActFramework是一种简洁易用,具有强大表达力的Java MVC全栈框架: 非Servlet架构,数秒之内启动项目。拷贝文件即部署 无与伦比的开发体验。即改即刷,开发过程无需重启 强劲的运行时性能 强大...

罗格林 ⋅ 2017/02/16 ⋅ 16

ActFramework 1.6.1 发布 - 增强和 bug 修复版

ActFramework 是一个功能强大易用的 Java 全栈 Web 开发框架. 依托于 undertow 提供的网络层服务, ActFramework 摈弃了老式难用的 Servlet 框架, 并提供了开发时热加载特性, 非常便于开发. a...

罗格林 ⋅ 01/06 ⋅ 24

Python的HTTP API客户端--Beckett

Beckett是一个基于惯例的(convention-based)框架,是为了建设HTTP APIs的 Python接口。 因为它是基于惯例的,它不需要使用魔法就能用语HTTP APIs,像REST风格的URI和资源一样。 资源被声明...

匿名 ⋅ 2016/08/05 ⋅ 0

ActFramework 1.0 正式发布, Java MVC 框架

ActFramework 是一个Java的非轻量级全栈式MVC框架. 和其他框架相比ActFramework的主要特点有: 热加载. 开发过程(包括新增方法变量)不需要重启系统, 随时可以看到最新代码的效果 强大的参数绑...

罗格林 ⋅ 2017/03/09 ⋅ 72

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 44分钟前 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 今天 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部