Spring MVC - 如何根据查询参数返回不同的JSON响应?

时间:2015-06-28 03:55:52

标签: rest spring-mvc

我正在使用Spring MVC实现REST api。要求是:

  1. /transactions返回一系列交易。
  2. /transactions?groupByCategory返回按类别分组的交易。
  3. 例如,请求#1返回:

    [
        { "id": 1, "category": "auto", "amount": 100 },
        { "id": 2, "category": "misc", "amount": 200 },
        { "id": 3, "category": "auto", "amount": 300 }
    ]
    

    而请求#2按类别对此结果进行分组,并返回每个类别的总和:

    [
        { "category": "auto", "amount": 400 },
        { "category": "misc", "amount": 200 }
    ]
    

    显然,这些请求的返回值是不同类型的。我如何在Spring MVC中执行此操作?到目前为止,我有:

    @RequestMapping("/transactions")
    public List<Transaction> getTransactions(
            @RequestParam(value="groupByCategory", required=false) String groupByCategory
            ) {
    
        ...
    }
    

    但是这会将返回类型修复为List<Transaction>。我如何容纳第二种类型:List<TransactionSummaryByCategory>

    编辑:我找到了一个解决方案,即将返回类型指定为Object。这似乎有效,并且响应是根据对象类型正确序列化的。但是,我想知道这是否是最好的做法!

    public Object getTransactions(...) {
        ...
    }
    

2 个答案:

答案 0 :(得分:4)

您可以在控制器中简单地提供两种方法。第一个使用

返回List<Transaction>映射
@RequestMapping("/transactions")

,第二个返回List<TransactionSummaryByCategory>并使用

进行映射
@RequestMapping(value = "/transactions", params = "groupByCategory")

答案 1 :(得分:1)

您可以返回通用列表。

public List<?> getTransactions() 
{
}

根据请求参数,您可以使用适当的对象填充列表