首先让我解释一下我的设置。
我的Web应用程序由多个模块组成,这些模块以模块1使用模块2中的控制器/服务来重新创建通用功能并因此删除代码冗余的方式相互链接。所以简单地说,2个独立的Web应用程序,其中1个应用程序中的所有类都包含在另一个应用程序中。
现在,我面临的问题是由于子模块中的常见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,已映射的网址为/user/
& /client/
这在任何意义上都是合法的。现在,当模块1出现时,正如预期的那样,Spring抛出一个异常,说明网址/client/
已经通过A.helloWorld()
和C.helloWorld()
映射进行了映射。
有解决方法吗?我可以让Spring简单地忽略超类中的方法级RequestMappings吗?或者有没有办法我可以破解Spring忽略/覆盖映射(就像根级RequestMappings那样)?
非常感谢任何帮助。
谢谢,
萨米特
答案 0 :(得分: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中声明基类抽象,这样就不会创建对应于基类的控制器。
第三种方法,如果基类对您来说不重要,可以放置@RequestMapping,它根本不会与为模块1指定的RequestMappings发生冲突。