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

时间:2012-08-12 13:52:08

标签: spring api rest controller

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

@Controller
@RequestMapping("/api")

例如,我的用户控制器应扩展基本api控制器并在路径中添加“/ users”,因此它将回答“/ api / users”请求。因此UserController将具有:

@Controller
@RequestMapping("/users")

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

当然我可以在所有控制器之前添加“/ api”,这样就可以在没有父类的情况下实现,但是如果可能的话,我更喜欢“正确的方式”,这样我就可以用更干净的方法来定义我的api实现和更明显的路径。

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

2 个答案:

答案 0 :(得分:3)

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

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


}

@Controller
public class ExtendedAbstractController extends AbstractController {

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

}

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

如果您尝试扩展而不是注释为控制器的抽象类,并且具有@RequestMapping s,则会在RequestMappingHandlerMapping初始化的步骤中出现错误。

答案 1 :(得分:0)

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

  1. 为具有相同路径前缀的控制器创建子上下文配置
  2. 创建具有映射到特定路径的自己DispatcherServlet的子上下文
  3. 看看this answer。这是类似的问题,但适用于@RestControllers