实现 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
注释并且必须是抽象。
如果您尝试扩展注释为控制器的非抽象类并且具有@RequestMapping
s,您会在RequestMappingHandlerMapping
初始化的步骤中遇到错误。
【讨论】:
嗨,对不起,我一定是不知何故错过了你的答案。不幸的是,这不会满足我的需要,因为我希望实现类也有自己的“基础”映射,所以 ExtendedAbstractController 应该有一个 @RequestMapping("/another") 注释,以便它的所有方法都有这个前缀。在您的解决方案中,只有带有 RequestMapping 注解的方法才会有扩展注解。 @TheZuck 是的,我明白了,我知道这不是您需要的。 :[ 只是想帮助你。:) 目前 Spring 不支持你想要的注释继承......顺便说一句,你可以去 spring JIRA 并投票给相同的或根据你的建议创建新问题。 ;)以上是关于实现 Spring 控制器时共享一个公共父路径的主要内容,如果未能解决你的问题,请参考以下文章