【问题标题】:Interfaces and @RequestBody接口和@RequestBody
【发布时间】:2011-06-11 21:01:01
【问题描述】:

我目前正在开展一个项目,该项目允许用户(通过网络)在给定时间段内预订所选资源的使用。在这个程序中,我试图保持 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 映射所期望的对象,或者是否有人对如何构建我的控制器接口以包含这些有任何建议方法?

干杯

【问题讨论】:

  • 请不要将<code> 用于代码块。选择代码块并单击带有花括号的图标(或仅缩进四个空格)

标签: java json spring spring-mvc jackson


【解决方案1】:

我不确定它是否有效,但您可以尝试使其通用:

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

【讨论】:

  • 效果很好!我不太精通泛型,所以我永远不会想到这一点。感谢您的快速回复!
【解决方案2】:

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

@JsonDeserialize(as=BookableResourceImp.class)

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

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

【讨论】:

  • 此解决方案会将接口与实现耦合,这似乎是一种不好的做法?
  • @Chris 如果你可以在糟糕的做法和没有解决方案之间做出选择,你会选择哪一个?添加了另一种方法来实现这一点。
  • 我有一个案例,接口的默认实现实际上是一个工厂,因为我需要数据来知道要使用哪个实现,这个解决方案对实现这一点有很大帮助。
猜你喜欢
  • 2019-10-16
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-19
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多