0

我把大部分课程都放在了

  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,但这是我可以确认的:

  1. package 下没有class/classpath com.company.productline.i18n.someServiceClass,但是下有class com.company.productline.product.i18n.someServiceClass

  2. 该类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 上运行

请帮助,提前谢谢。

4

1 回答 1

0

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

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

谢谢宁。

于 2013-01-15T15:24:27.993 回答