组件扫描中的base-package选择了错误的子包

时间:2013-01-15 00:53:02

标签: java spring java-ee spring-mvc

我把大部分课程都放在了

之下
  com.company.productline.product  -- classpath 1

在该类路径中将有service,web,domain,i18n ... subpackages。

由于某种原因,我在jar中包含了另一个服务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]'

问题是Spring似乎在错误的包com.company.productline.i18n.someServiceClass下找到了一个bean类,中间没有product,但这是我可以确认的:

  1. com.company.productline.i18n.someServiceClass下没有类/类路径,但com.company.productline.product.i18n.someServiceClass下有一个类。

  2. someServiceClass确实有@Component注释。

  3. 但是如果我在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上运行

    请提前帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

原来ninn是正确的。除了应用程序中只有一个具有相同bean名称的类之外,没有其他可能性。

在这种情况下项目搜索无效的原因是我们有另一个具有相同服务类的jar文件。直到我注意到,我才知道。删除源代码中的类后,错误就消失了。

谢谢你。