@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"
}
]
}
]
那如果我想控制返回列表的数据,让每项只返回author
和title
,我可以在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