我把大部分课程都放在了
com.company.productline.product -- classpath 1
在该类路径中将有服务、Web、域、i18n... 子包。
出于某种原因,我将另一个服务 bean 包装在一个罐子里,它应该适用于整个产品线,因此它在
com.company.productline -- classpath 2
所以在 applicationContext.xml 中,组件扫描的基础包必须妥协到上一层,作为类路径 2 而不是类路径 1,像这样
<context:component-scan base-package="com.company.productline">
<context:exclude-filter expression=".*_Roo_.*" type="regex"/>
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
然后让 Spring 扫描整个应用程序的 @Service 或 @Component ,甚至在那个 jar 文件中。
但是,现在在 applicationContext 中有一个错误说:
Annotation-specified bean name 'someServiceClass' for bean class
[com.company.productline.i18n.someServiceClass] conflicts with existing,
non-compatible bean definition of same name and class
[com.company.productline.product.i18n.someServiceClass]'
com.company.productline.i18n.someServiceClass
问题是Spring似乎在没有中间的虚假包下找到了一个bean类product
,但这是我可以确认的:
package 下没有class/classpath
com.company.productline.i18n.someServiceClass
,但是下有classcom.company.productline.product.i18n.someServiceClass
。该类
someServiceClass
确实有一个@Component 注释。
但是,如果我将 中的类路径降低一级base-package
,错误就消失了:
<context:component-scan base-package="com.company.productline.product">
<context:exclude-filter expression=".*_Roo_.*" type="regex"/>
<context:exclude-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
</context:component-scan>
该类的定义如下:
@Component
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "request")
public class SomeServiceClass implements CurrentRequest {
@Autowired
private HttpServletRequest request;
public Locale getCurrentLocale() {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
return localeResolver.resolveLocale(request);
}
public HttpServletRequest getRequest() {
return request;
}
public void setRequest(HttpServletRequest request) {
this.request = request;
}
}
所以真的不知道发生了什么以及为什么会出现这个问题。
该应用程序在 STS 2.9.1 上的 Spring 3.1.0 上运行
请帮助,提前谢谢。