组件扫描未在Tomcat webapp中的JAR中找到@Component

时间:2011-07-21 09:23:30

标签: spring web-applications applicationcontext opencms

我刚刚在Spring bugsystem(https://jira.springsource.org/browse/SPR-8551)中提交了一个错误,但我仍然不确定我是否遗漏了某些东西

我跟踪<context:component-scan/>对此声明的问题。 给定以下两个类在Web应用程序的WEB-INF / lib中的相同JAR中(JAR文件具有目录结构):

测试/ TheBean.java:

package test;
@Component
public class TheBean{
}

测试/ BeanSearcher.java:

package test;
public class BeanSearcher{

  public void init(){ 
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
    ctx.scan("test"); 
    ctx.refresh(); 
    TheBean b=  ctx.getBean(TheBean.class); 
    // What is the value of b? 
  }
}

如果我在jUnit测试用例或其他类型的独立应用程序中运行new BeanSearcher().init(),则会为b分配一个TheBean实例,但是如果我在JSP中运行它,那么ctx.getBean()是返回null。

所以,我做错了什么或没有考虑到某些事情,这只是一个错误......?

编辑8/8/2011:当我试图简化问题时似乎运行良好,但是,当我尝试使其工作时,在OpenCms的初始化中,它失败了。现在我试图寻找工作版本和不工作版本之间的差异。 (类加载器,不同JAR中相关类的使用或直接在WEB-INF /类中,通过反射调用等)。

2 个答案:

答案 0 :(得分:10)

正如我在评论中所写,解决方案的答案如下: Spring Annotation-based controllers not working if it is inside jar file

  

在eclipse中使用导出实用程序导出jar文件时   是一个名为添加目录条目的选项。

答案 1 :(得分:2)

显而易见的问题是你的web.xml中是否包含这些内容:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>WEB-INF/foo.xml</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

如果没有这些,Spring根本就不会加载,更不用说正确构建bean ......