Java MVC REST API中带有Jackson的动态JSON类型 情景
我需要构建一个API,为客户端提供对存储在DB中的几种对象的访问(从今天起,我的DAO是基于Hibernate的)。这些可以是Java MVC REST API中带有Jackson的动态JSON类型 情景,java,json,rest,spring-mvc,jackson,Java,Json,Rest,Spring Mvc,Jackson,我需要构建一个API,为客户端提供对存储在DB中的几种对象的访问(从今天起,我的DAO是基于Hibernate的)。这些可以是GETted或POSTed 当前,GET签名如下: @RequestMapping(value = "/rest/{datatype}", method = RequestMethod.GET, produces = { "application/json" }) public @ResponseBody Objec
GET
ted或POST
ed
当前,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对象)
Jackson成功地将JSON转换为对象,但我不知道编译时的对象类型
另一个要求是灵活性:当一个新类被添加到域中时,几乎不需要进行代码工作来支持新的数据类型。在GET
ter中,我只添加了一个开关来支持新的数据类型,用Spring实例化正确的存储库并查询数据库
问题
我如何编写一个SpringMVCERESTAPI,它接受“任何东西”作为请求体,并允许我从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)
}
这样,当SpringMVC分析路径时,它会找到处理请求的正确控制器方法。然后它要求Jackson将请求主体转换为反射检测到的参数类型。通过路径变量或请求参数获取类名。 为名称查找类。 使用对象映射器将作为链接hashmap的请求主体转换为正确的类