我正在尝试在具有传统Java(控制器)servlet(而不是Spring的Dispatcher servlet)的项目中重用基于Spring-JDBC的DAO类和代码。如下所示,我尝试使用ClassPathXmlApplicationContext手动启动application-config.xml。但是,我得到了下面进一步显示的错误。
private static final String CONFIG_PATH = "classpath*:application-config.xml";
private signupDao SignupDao;
ApplicationContext context = new ClassPathXmlApplicationContext(CONFIG_PATH);
signupDao = context.getBean(SignupDao.class);
org.springframework.beans.factory。 NoSuchBeanDefinitionException :未定义[com.abc.dao.SignupDao]类型的合格bean at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371) 在org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331) 在org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
之前,我没有将以下条目添加到application-config.xml中,但即使添加它之后,我仍然得到与上面相同的错误(“没有定义类型的限定bean”)。
<bean id="signupDao" class="com.abc.dao.SignupDao"></bean>
有什么想法吗?
控制器servlet不是我自己的,我是从第三方获得的,我只是试图扩展他们的处理程序,这是我正在尝试使用Spring自动装配,JDBC等。
编辑:
我能加载的唯一bean是context.getBean(MessageSource.class)
,我的bean都不能加载。我之前尝试时getBeanDefinitionNames
返回空数组。你认为这是一个类路径问题吗?
答案 0 :(得分:2)
要缩小问题范围,请确保已成功创建正在创建的ApplicationContext。
这应该返回给定应用程序上下文中的所有bean名称。
context.getBeanDefinitionNames();
<强>更新强>
如果ApplicationContext没有列出xml配置中的任何bean,则可能表明ClassPathXmlApplicationContext
无法访问资源文件。
检查的一种方法是做这样的事情:
ClassPathXmlApplicationContext.class.getClassLoader().getResourceAsStream("application-config.xml")
如果资源可访问,这应返回有效的非空流。
注意资源名称的格式。它不应包含classpath:
或classpath*:
答案 1 :(得分:2)
从classpath*:
中移除CONFIG_PATH
部分,因为ClassPathXmlApplicationContext
已经在文件的类路径中查找(查看它的名称);
确保您的application-config.xml
文件位于Web应用程序的WEB-INF/classes
目录的根目录中,否则它将不在类路径中(这假定文件不是包装在另一个罐子里)。