【问题标题】:Share a common parent path when implementing Spring controllers实现 Spring 控制器时共享一个公共父路径
【发布时间】: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”。

【问题讨论】:

    标签: spring api rest controller


    【解决方案1】:

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

    1. 为具有相同路径前缀的控制器创建子上下文配置
    2. 创建子上下文,将自己的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 并投票给相同的或根据你的建议创建新问题。 ;)
      猜你喜欢
      • 2015-06-11
      • 1970-01-01
      • 2016-01-18
      • 2015-02-14
      • 2014-08-16
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      相关资源
      最近更新 更多