实现 Spring 控制器时共享一个公共父路径

Posted

技术标签:

【中文标题】实现 Spring 控制器时共享一个公共父路径【英文标题】:Share a common parent path when implementing Spring controllers 【发布时间】:2012-08-08 23:54:31 【问题描述】:

我希望能够定义一个具有“/api”映射的父控制器类,然后用我的不同实现扩展该控制器。 所以 ApiController 会有:

@Controller
@RequestMapping("/api")

例如,我的用户控制器应该扩展基本 api 控制器,并将“/users”添加到路径中,因此它将响应“/api/users”请求。所以 UserController 会有:

@Controller
@RequestMapping("/users")

但由于它扩展了 ApiController,它将有效地响应 /api/users。

当然,我可以在所有控制器前面加上“/api”,这样就可以在没有父类的情况下实现这一点,但如果可能的话,我更喜欢“正确的方式”,这样我就可以用更清洁的方式定义我的 api 实现和更明显的路径。

我尝试扩展 ApiController 基类,但这不起作用,UserController 仍然响应“/users”并忽略基类“/api”。

【问题讨论】:

【参考方案1】:

您可以通过以下方式实现:

    为具有相同路径前缀的控制器创建子上下文配置 创建子上下文,将自己的DispatcherServlet 映射到特定路径

看看this answer。这是类似的问题,但对于@RestControllers

【讨论】:

【参考方案2】:

嗯。你可以试试这个,它对我有用:

@RequestMapping("/abstract")
public abstract class AbstractController 




@Controller
public class ExtendedAbstractController extends AbstractController 

   @RequestMapping("/another")
   public String anotherTest() 
       return "another";
   


请注意,您的基类必须没有@Controller 注释并且必须是抽象

如果您尝试扩展注释为控制器的非抽象类并且具有@RequestMappings,您会在RequestMappingHandlerMapping 初始化的步骤中遇到错误。

【讨论】:

嗨,对不起,我一定是不知何故错过了你的答案。不幸的是,这不会满足我的需要,因为我希望实现类也有自己的“基础”映射,所以 ExtendedAbstractController 应该有一个 @RequestMapping("/another") 注释,以便它的所有方法都有这个前缀。在您的解决方案中,只有带有 RequestMapping 注解的方法才会有扩展注解。 @TheZuck 是的,我明白了,我知道这不是您需要的。 :[ 只是想帮助你。:) 目前 Spring 不支持你想要的注释继承......顺便说一句,你可以去 spring JIRA 并投票给相同的或根据你的建议创建新问题。 ;)

以上是关于实现 Spring 控制器时共享一个公共父路径的主要内容,如果未能解决你的问题,请参考以下文章

Linux进程间通信 共享内存+信号量+简单样例

10进程控制1

代码优化

缓存控制中的私有与公共

spring mvc常用注解总结

基于注解实现简单Spring框架:完成IOC容器和声明式事务控制