【问题标题】:Spring MVC Abstract Controller::How to get exact method signature when implementing an abstract controller interfaceSpring MVC Abstract Controller::实现抽象控制器接口时如何获取准确的方法签名
【发布时间】:2012-03-26 22:36:59
【问题描述】:

我正在使用 STS 2.8.1 和 Spring 3.1.1.RELEASE。

我有一个像下面这样的抽象控制器

public abstract class SuperController {

@RequestMapping(value = "/Entity", method = RequestMethod.POST, headers = "Accept=application/xml,application/json")
    public abstract @ResponseBody OAuthEntity setOAuthEntity(@RequestBody OAuthEntity oAuthEntity);

@RequestMapping(value = "/Entity/{id}", method = RequestMethod.GET, headers = "Accept=application/xml,application/json")
    public abstract @ResponseBody OAuthEntity getOAuthEntity(@PathVariable("id") Long id);
}

当我在 STS 中扩展控制器时,它会给出如下方法签名

    @Override
public OAuthEntity setOAuthEntity(OAuthEntity oAuthEntity) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public OAuthEntity getOAuthEntity(Long id) {
    // TODO Auto-generated method stub
    return null;
}

我知道@RequestMapping 可以很好地继承,并且我还测试了代码(它有效!!)。 我想要的是,当我扩展超类时,我应该像抽象类一样获得@ResponseBody、@PathVariable("id") 和@RequestBody。

当然我可以手动编辑它(这就是我正在做的,但想要一种更优雅的方式)以便 Sub 类具有如下所示的方法签名

    @Override
public @ResponseBody OAuthEntity setOAuthEntity(@RequestBody OAuthEntity oAuthEntity) {

    @Override
public @ResponseBody OAuthEntity getOAuthEntity(@PathVariable("id") Long id) {

不得不手动编写它并没有杀死我,但令人沮丧。 非常感谢任何帮助。

【问题讨论】:

    标签: eclipse spring


    【解决方案1】:

    Spring 3 取消了控制器交互的概念。我的建议是放弃抽象的 Controller 想法,只需将这些注释添加到控制器。

    在这种情况下,继承没有任何意义。您需要一种且只有一种控制器方法来处理应用程序中的给定请求映射。在我看来,没有必要建立父母/孩子的关系。我建议您将这些注释移动到适当的控制器实现中并删除您的抽象类。

    【讨论】:

    • 我希望在多个控制器之间拥有相同的方法签名,因此是父/子关系。这样,我可以针对不同的上下文有不同的实现,例如超级控制器是 OauthController,子控制器是 /google、/facebook 等。
    猜你喜欢
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2014-10-28
    • 2011-11-20
    • 1970-01-01
    • 2020-02-04
    相关资源
    最近更新 更多