7

我目前正在开展一个项目,该项目允许用户(通过网络)在给定的时间段内预订(通过网络)所选资源的使用。在这个程序中,我试图保持 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 的特定实现,这意味着我很可能需要从接口中排除这些方法,即使用于此目的的任何控制器都需要这些方法。

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

干杯

4

2 回答 2

12

我不确定它会起作用,但您可以尝试使其通用:

public interface BookableResourceController<R extends BookableResource> {
    @RequestMapping(value="/delete.html", method = RequestMethod.POST)
    public ModelAndView processDeleteResource(@RequestBody R resource); 
}
于 2011-01-19T16:09:46.157 回答
2

可以使用的其他方法是使用 Jackson 注释来注释接口:

@JsonDeserialize(as=BookableResourceImp.class)

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

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

于 2011-01-20T01:34:25.717 回答