【问题标题】:Extend annotated controllers in Spring MVC在 Spring MVC 中扩展带注释的控制器
【发布时间】:2015-11-06 00:05:36
【问题描述】:

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

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

【问题讨论】:

  • 如果您从BaseController 中删除@Controller 注释,它应该可以工作,除非有理由也必须在那里维护它。
  • 你的基类中不应该有super.toExtend();。由于父类是Object,因此没有称为toExtend()super 方法。
  • 是的,你是对的,这是一个复制粘贴错误,我编辑了它。

标签: java spring-mvc


【解决方案1】:

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

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

【讨论】:

  • 这似乎是一个很好的解决方案 - 重新映射控制器使用的基本 URL 非常简单 :)
【解决方案2】:

如果BaseController的注解不能去掉,那么可以使用Adapter Pattern来获取继承。

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

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

在通常情况下,BaseController 没有@Controller 注释,因此可以将常用的控制器方法放在BaseController 中,以由实际控制器

进行扩展

【讨论】:

  • 适配器模式需要将 toExtend() 从受保护更改为公共。似乎不可能完全保留 BaseController 的原样,我想我会删除 @controller,因为这似乎是在更新时重现更改的“最简单”的方式。
猜你喜欢
  • 2010-09-14
  • 2010-12-30
  • 1970-01-01
  • 2011-12-21
  • 2015-01-15
  • 2011-03-12
  • 2014-04-17
  • 2011-12-24
  • 1970-01-01
相关资源
最近更新 更多