7

我刚刚在 Spring 错误系统 ( 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? 
  }
}

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

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

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

4

2 回答 2

10

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

当您使用 eclipse 中的导出实用程序导出 jar 文件时,有一个名为“添加目录条目”的选项。

于 2012-12-24T16:46:28.513 回答
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...</p>

于 2011-07-22T13:12:02.193 回答