1

场景

我需要构建一个 API,为客户端提供对存储在数据库中的多种对象的访问权限(我的 DAO 是基于 Hibernate 的今天)。这些可以GETted 或POSTed。

目前GET签名如下:

@RequestMapping(value = "/rest/{datatype}", method = RequestMethod.GET, produces = { "application/json" })
    public @ResponseBody
    Object[] getData(@PathVariable("datatype") String dataType,
            WebRequest request) throws HttpException {

这意味着根据 URL 中的数据类型,我将访问给定的存储库并返回我的业务域的对象。到目前为止它工作正常。

对于POST,我必须能够提交 JSON 格式的对象,将其转换为类并将其存储到数据库中。

显然,如果我使用postFunfData(SpecificDataType object)Jackson 成功将 JSON 转换为对象,但我在编译时不知道对象类型。

另一个要求是灵活性:当一个新类被添加到域中时,需要做很少的代码工作来支持新的数据类型。在GET第三节中,我只是添加了一个开关来支持新的数据类型,使用 Spring 实例化正确的存储库并查询数据库。

问题

如何编写一个 Spring MVC REST API 接受“任何东西”作为请求主体并允许我从 JSON 转换为正确的对象?就像是:

public void postData(@RequestBody Object objData){
    if (objData instanceof Class1) {
        Class1 obj = (Class1) objData;
        Class1Repository.store(obj);
    }
    [...]
}
4

2 回答 2

0

可能的答案

(如果您找到更好的解决方案,请提供您的)

基于同一个骨架创建几个简单的 API

@RequestMapping(value = "/rest/class1", method = RequestMethod.POST, consumes = { "application/json" })
public void postData(@RequestBody Class1 objOfClass1){
    store(objOfClass1)
}

@RequestMapping(value = "/rest/class2", method = RequestMethod.POST, consumes = { "application/json" })
public void postData(@RequestBody Class2 objOfClass2){
    store(objOfClass2)
}

这样,当 Spring MVC 分析路径时,它会找到处理请求的正确控制器方法。然后它要求 Jackson 将请求正文转换为反射检测到的参数类型。

于 2013-02-12T13:20:22.970 回答
0

通过路径变量或请求参数获取类名。查找名称的类。使用对象映射器将作为链接哈希图的请求主体转换为正确的类。

于 2014-07-10T10:24:43.967 回答