Actframework中如何灵活控制JSON响应

@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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我是攻城师

在spring-boot中使用@ConfigurationProperties注解

2874
来自专栏Java修行之道

SpringMVC中controller接收Json数据

1281
来自专栏小勇DW3

Spring的原理性总结

Bean的生命过程可以借鉴Servlet的生命过程,了解其生命过程对于不管是思想还是以后的使用都很有帮助;

1K5
来自专栏程序员互动联盟

linux设备驱动第五篇:驱动中的并发与竟态

综述 在上一篇介绍了linux驱动的调试方法,这一篇介绍一下在驱动编程中会遇到的并发和竟态以及如何处理并发和竞争。 首先什么是并发与竟态呢?并发(concurr...

34410
来自专栏Ryan Miao

springmvc学习笔记--json--返回json的日期格式问题

(一)输出json数据 springmvc中使用jackson-mapper-asl即可进行json输出,在配置上有几点: 1.使用mvc:annotation...

42810
来自专栏xingoo, 一个梦想做发明家的程序员

C/C++ 遇到0xcccccccc访问冲突

最近一直在纠结这个问题. ? 最近写代码,总是遇到这个问题,一旦遇到这个问题,以前好使的代码也就不好使了。很费解,上网搜集了下资料.... 这个0xcccccc...

2077
来自专栏xingoo, 一个梦想做发明家的程序员

Elasticsearch安装

在启动或者安装ES之前,需要先下载JDK 1.7以上的版本,对于2.0来说,要求JDK1.8以上。 检查JDK的版本 使用命令: java -versio...

2396
来自专栏Kirito的技术分享

使用spring validation完成数据后端校验

前言 数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户...

89612
来自专栏后端之路

SpringBoot 打包之可运行jar

背景 一个可运行的工具始终比XXX配置更加方便 每次一堆tomcat版本指定,对应jar替换 各种打包 替换properties 参考 maven profil...

46010
来自专栏Golang语言社区

Golang同步:锁的使用案例详解

互斥锁 互斥锁是传统的并发程序对共享资源进行访问控制的主要手段。它由标准库代码包sync中的Mutex结构体类型代表。只有两个公开方法 Lock Unlock ...

3798

扫码关注云+社区