2013-04-09 100 views
4

我在一个小的项目工作,有一些现有的代码,我想保持从我的变化干净,所以我需要延长一个注解控制器,但是,这并不工作:扩展注解控制器

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的情况下扩展这样的注解驱动控制器?

+1

它应该工作,如果你从'BaseController'中删除了'@ Controller'注释,除非有理由必须在那里维护它。 – 2013-04-09 16:35:38

+0

你的基类中不应该有'super.toExtend();'。由于父类是Object,因此没有'super'方法叫'toExtend()'。 – 2013-04-09 16:37:44

+0

是的你是对的这是一个复制粘贴错误,我编辑它。 – 2013-04-09 17:01:20

回答

6

扩展可以通过另一弹簧控制器延伸的一个弹簧控制器。

当Spring MVC控制器扩展了另一个控制器时,基本控制器的功能可以由子控制器使用子控制器的请求URL直接使用。你可以在这里得到更多的细节Extending Spring controllers

+0

这似乎是一个很好的解决方案 - 重新映射控制器使用的基本URL非常简单:) – 2015-11-06 08:12:34

2

如果BaseController的注解不能被删除,那么您可以使用Adapter Pattern来获得继承。

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

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

在通常情况下,或者BaseController没有@Controller注解,因此公共控制器方法可以内部BaseController付诸由实际控制

+0

适配器模式将需要将toExtend()从protected更改为public。看起来它不可能完全离开BaseController,我想我会删除@controller,因为它似乎是“最简单”的方式来重现更新情况下的更改。 – 2013-04-09 17:05:38