我刚刚在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 /类中,通过反射调用等)。
答案 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 ......