4

我正在使用Spring MVC并返回JSON作为响应。我想创建一个通用JSON响应,我可以在其中输入任何类型并希​​望响应看起来像这样

{
    status : "success",
    data : {
        "accounts" : [
            { "id" : 1, "title" : "saving", "sortcode" : "121212" },
            { "id" : 2, "title" : "current", "sortcode" : "445566" },
        ]
     }
}

所以我创建了一个Response<T>对象

public class Response<T> {

    private String status;
    private String message;
    T data;
...
...
}
  1. 这是这样做的正确方法,还是有更好的方法?
  2. 您如何在Spring控制器中使用此 Response 对象来返回一个空的响应对象和/或填充的响应对象。

在此先感谢 GM

更新:

为了获得与JSON所描述的类似的输出,即使用“accounts”键输入JSON,我必须Response<Map<String, List<Account>>>在控制器中使用以下内容:

@RequestMapping(value = {"/accounts"}, method = RequestMethod.POST, produces = "application/json", headers = "Accept=application/json")
    @ResponseBody
    public Response<Map<String, List<Account>>> findAccounts(@RequestBody AccountsSearchRequest request) {
        //
        // empty accounts list
        //
        List<Account> accountsList = new ArrayList<Account>();

        //
        // response will hold a MAP with key="accounts" value="List<Account>
        //
        Response<Map<String, List<Account>>> response = ResponseUtil.createResponseWithData("accounts", accountsList);

        try {
            accountsList = searchService.findAccounts(request);

            response = ResponseUtil.createResponseWithData("accounts", accountsList);
            response.setStatus("success");
            response.setMessage("Number of accounts ("+accounts.size()+")");
        } catch (Exception e) {
            response.setStatus("error");
            response.setMessage("System error " + e.getMessage());
            response.setData(null);
        }

        return response;
    }

这是这样做的正确方法吗?即为了获得JSON输出中的“帐户”键?

4

1 回答 1

2

虽然您的示例 JSON 无效(status并且data未包含在引号中),但此方法将起作用。

你需要确保你的类路径中有 Jackson jars,其余的由 Spring 处理。

为了让它工作,我会为你的响应类创建一个构造函数,看起来像这样:

public class Response<T> {

    private String status;
    private String message;
    private T data;

    public Response(String status, String message, T data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }

    //...getter methods here

}

然后在您的 Spring 控制器中,您只需从映射的方法中返回此对象@RequestMapping

@Controller
public class MyController {
    @RequestMapping(value="/mypath", produces="application/json")
    public Response<SomeObject> myPathMethod() {
        return new Response<SomeObject>("200", "success!", new SomeObject());
    }
}
于 2013-06-30T00:27:37.250 回答