【问题标题】:Generic Spring MVC Controller with Inheritance具有继承的通用 Spring MVC 控制器
【发布时间】:2013-03-13 10:13:18
【问题描述】:

我可以在 Spring MVC 中执行以下操作吗

假设我有如下的 Base GenericController 和一个请求映射“/list”

@Controller
public class GenericController<T>{

    @RequestMapping(method = RequestMethod.GET, value = "/list")
    public @ResponseBody List<T> getMyPage(){
        // returns list of T
    }

}

下面是我的两个控制器

@Controller(value = "/page1")
public class Page1Controller extends GenericController<Page1>{

}

@Controller(value = "/page2")
public class Page2Controller extends GenericController<Page2>{

}

现在我可以访问网址“/page1/list”和“/page2/list”,其中第一个转到 Page1Controller,第二个转到 Page2Controller。

【问题讨论】:

  • AFAIK,注释没有被继承,所以这可能无法按预期工作

标签: spring-mvc controller


【解决方案1】:

这是不可能的并且已经被拒绝,请参阅SPR-10089。我认为这会有点令人困惑,此外,除了不同的映射之外,这些方法的行为不太可能完全相同相同。 但是你可以使用委托:

public class BaseController<T> {
    public List<T> getPageList(){
        // returns list of T
    }
}

@Controller(value = "/page1")
public class Page1Controller extends BaseController<Page1>{
    @RequestMapping(method = RequestMethod.GET, value = "/list")
    public @ResponseBody List<Page1> getMyPage() {
      return super.getPageList();
    }    
}

@Controller(value = "/page2")
public class Page2Controller extends BaseController<Page2>{
    @RequestMapping(method = RequestMethod.GET, value = "/list")
    public @ResponseBody List<Page2> getMyPage() {
      return super.getPageList();
    }
}

【讨论】:

  • 我认为 SPR-10089 不适合这个例子,它在概念上应该可以工作。 SPR-10089 不会在类级别的 @RequestMapping 上“堆叠”url 映射。有关完整说明,请参阅此stackoverflow.com/questions/5268643/…
  • 在这个例子中,应该可以在基类中有一个类级别的注解和方法级别的注解。
  • 这将如何工作?对于每个资源,您通常都有 CrudRepository 或类似的服务。通过委托给父级,您将如何获得正确的存储库?您将需要以某种方式将其作为参数传递,这将是丑陋的
  • @robin 看来这个答案已经过时了。看看 manish 的回答。
【解决方案2】:

对于那些寻找与 Spring Framework 4.x 类似的东西的人,OP 提供的类层次结构是可能的。 Github 上提供了示例应用程序。它允许用户以 JSON 格式查看书籍列表或杂志列表。

【讨论】:

  • 为什么说超类型没有@RequestMapping注解呢?超级类型 BaseController 确实在 list 方法上有注释,这是问题中第一个代码 sn-p 显示的内容。可能您有不同的要求并感到困惑?
  • manish,你是对的,很抱歉有错误的评论 - 我会删除它并投票 ;-) 编辑:该解决方案对我来说很好,所以 IMO 这是正确的答案。
猜你喜欢
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多