java - MVC REST API 中使用 Jackson 的动态 JSON 类型

标签 java json rest spring-mvc jackson

场景

我需要构建一个 API,为客户端提供对存储在数据库中的多种对象的访问(我的 DAO 目前是基于 Hibernate 的)。这些可以被GET编辑或POST编辑。

当前 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 转换为对象,但我在编译时不知道对象类型。

另一个要求是灵 active :当将新类添加到域中时,只需执行很少的代码工作即可支持新的数据类型。在 GET 中,我只需添加一个开关来支持新的数据类型,使用 Spring 实例化正确的存储库并查询数据库。

问题

如何编写一个 Spring MVC REST API,它接受“任何内容”作为请求正文并允许我从 JSON 转换为正确的对象?像这样的东西:

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

最佳答案

可能的答案

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

基于同一骨架创建几个简单的 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 分析路径时,它会找到处理请求的正确 Controller 方法。然后它要求 Jackson 将请求正文转换为反射检测到的参数类型。

关于java - MVC REST API 中使用 Jackson 的动态 JSON 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14833466/

相关文章:

jQuery 和 IE,完全没有行为

java - 使用递归构建 JSON 树

rest - 如何将数组或枚举中的枚举值定义为映射属性中的键?

java - Rest Api 调用使用 Spring Oauth2 给出错误 400

rest - 如何以幂等方式重命名资源?

java - 如果 ORA-02049 包含在分布式事务中,对 "just change your program"的良好响应是什么?

java - 如何将 Perl 脚本翻译为 Java?

javascript - 如何使用整数作为 JSON 对象的 Key

java - 随机化游戏板的障碍

Java mysql十进制排序错误