12

我正在做一个小项目,并且有一些现有的代码,我想从我的更改中保持干净,因此我需要扩展一个带注释的控制器,但这不起作用:

package a;

@controller
public class BaseController {
    // Autowired fields

    protected x toExtend() {
         // do stuff
    }

    @RequestMapping(value = "/start")
    protected ModelAndView setupForm(...) {
        toExtend();
        // more stuff
    }
}



package b;

@controller
public class NewController extends BaseController {
    // Autowired fields

    @Override
    protected x toExtend() {
         super.toExtend();
         //new stuff
    }
}

扫描包 a 和 b 以查找控制器,我无法更改它。我真的没想到这会起作用,因为 @RequestMapping(value = "/start") 在两个控制器中都是多余的。因此,我得到了一个例外。

所以我的问题是,是否真的可以在不更改 BaseController 的情况下扩展这样的注释驱动控制器?

4

2 回答 2

26

您可以通过另一个弹簧控制器扩展一个弹簧控制器。

当一个 Spring MVC 控制器扩展另一个控制器时,基本控制器的功能可以通过子控制器的请求 URL 直接由子控制器使用。您可以在此处获取更多详细信息扩展 Spring 控制器

于 2015-11-05T16:05:36.987 回答
2

如果BaseController' 的注解不能被移除,那么你可以使用适配器模式来获得继承。

@Controller
public class NewController {
    // Autowired fields
    BaseController base;

    protected x toExtend() {
         base.toExtend();
         //new stuff
    }
}

在通常情况下,要么BaseController没有@Controller注释,因此可以将常用的控制器方法放入内部BaseController以由实际控制器扩展

于 2013-04-09T16:55:27.563 回答