场景
我需要构建一个 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/