接口和@RequestBody

时间:2011-01-19 16:06:19

标签: java json spring spring-mvc jackson

我目前正在开展一个项目,该项目允许用户在给定的时间段内(通过网络)预订所选资源的使用。在这个程序中,我试图遵循Spring对接口编程的哲学(以及通用的最佳实践),因此我尝试在具体类中重复功能的任何地方使用接口。

我创建的一个接口称为BookableResourceController,它指定控制器处理所需的任何类型资源所需的最低功能所需的方法。我还使用了第二个接口BookableResource,它可以识别哪些对象模拟了允许通过应用程序预订的资源。

我目前遇到的问题是,BookableResourceController定义的一些方法使用@RequestBody映射将JSON对象转换为方法参数,并且由于Jackson只能将JSON转换为“SimpleType”对象,因此我收到如果我将输入参数指定为BookableResource,则会出错。

@RequestMapping(value="/delete.html", method = RequestMethod.POST)  
public ModelAndView processDeleteResource(
    @RequestBody BookableResource resource); 
  

无法构造实例   org.codehaus.jackson.map.type.SimpleType,   问题:抽象类型只能是   用其他类型实例化   信息

据我所知,这个错误意味着我需要定义BookableResource的特定实现,这意味着我很可能需要从接口中排除这些方法,即使任何用于此目的的控制器都需要那些方法。

我要问的是,是否有人知道如何使用JSON将接口定义为@RequestBody映射所期望的对象,或者是否有人建议如何构造我的控制器接口以便包括这些方法?

干杯

2 个答案:

答案 0 :(得分:10)

我不确定它会起作用,但你可以试着让它变得通用:

public interface BookableResourceController<R extends BookableResource> {
    @RequestMapping(value="/delete.html", method = RequestMethod.POST)
    public ModelAndView processDeleteResource(@RequestBody R resource); 
}

答案 1 :(得分:1)

可以使用的其他方法是使用Jackson注释注释界面:

@JsonDeserialize(as=BookableResourceImp.class)

(如果不希望在接口类中直接添加混合注释,可能使用混合注释)

编辑:另一种可能性是使用SimpleModule方法addAbstractTypeMapping()来指定实现类型。这避免了从接口到实现的链接,并且可能(或可能不)是更方便的方式来注册这个方面。