0

让我先解释一下我的设置。

我的 Web 应用程序由多个模块组成,这些模块相互关联,模块 1 使用模块 2 中的控制器/服务来重新创建通用功能,从而消除代码冗余。简单地说,2 个独立的 Web 应用程序,其中 1 个应用程序的所有类作为 jar 包含在另一个应用程序中。

现在,我面临的问题是由于子模块中的常见 URL 映射,根据以下情况:

模块 1 的控制器 A 扩展模块 2 的控制器 B

package com.module1;

@RequestMapping("/client")
public class A extends B {

    @RequestMapping("/hello")
    public void helloWorldNew(...) {
        ...
    }
}



package com.module2;

@RequestMapping("/user")
public class B {

    @RequestMapping("/")
    public void helloWorld(...) {
        ...
    }
}

模块 1 的控制器 C 扩展模块 2 的控制器 D

package com.module1;

@RequestMapping("/client")
public class C extends D {

    @RequestMapping("/helloworld")
    public void helloWorldNew(...) {
        ...
    }
}



package com.module2;

@RequestMapping("/human")
public class D {

    @RequestMapping("/")
    public void helloWorld(...) {
        ...
    }
}

如您所见,将模块 2 分开来看,已映射的 URL 是/user/&/client/在任何意义上都是合法的。现在,当模块 1 出现时,正如预期的那样,Spring 会抛出一个异常,指出 URL/client/已经通过A.helloWorld()C.helloWorld()映射映射。

有没有解决的办法?我可以要求 Spring 简单地忽略在超类中找到的方法级 RequestMappings 吗?或者有没有办法让 Spring 忽略/覆盖映射(就像根级 RequestMappings 所做的那样)?

任何帮助将不胜感激。

谢谢,
苏米特

4

1 回答 1

2

我可以想到几种方法来做到这一点:

当您设置模块 1 时,您可以仅对模块 1 中与您相关的包进行组件扫描(假设模块 1 和模块 2 中的包名称不同:

<context:component-scan base-package="package1, package2" use-default-filters="false">
</context:component-scan>

如果包名差别不大,可以尝试按类名模式排除:

<context:exclude-filter type="regex" expression="*.Module1Class"/>

第二种方法是在模块 2 abstract 中声明基类,这样根本不会创建与基类对应的控制器。

第三种方法,如果基类对您来说不是那么重要,可以将 @RequestMapping 与为模块 1 指定的 RequestMappings 完全不冲突。

于 2012-05-15T21:12:27.980 回答