Spring web应用程序,自动连接依赖项的注入失败



我正在使用Spring和Maven设置一个简单的Hello World web应用程序。不知怎的,当我尝试自动连接我的测试bean时,我一直收到BeanCreationException。

你好豆:

package de.dijon.test;
public class HelloBean {
private String name;
public void setName(String name) {
this.name = name;
}
public String getHello() {
return ("Hello " + name);
}
}

web.xml:

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

application-context.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="helloBean" class="de.dijon.test.HelloBean"
autowire="byType">
<property name="name" value="Dijon" />
</bean>
</beans>

我的测试课程:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:/application-context.xml" })
public class AppTest extends TestCase {
@Autowired
private HelloBean obj;
@Test
public void test() {
assertNotNull(obj.getHello());
}
}

错误消息:

Dec 23, 2013 1:31:59 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.GenericApplicationContext@2b275d39: startup date [Mon Dec 23 13:31:59 CET 2013]; root of context hierarchy
Dec 23, 2013 1:31:59 PM org.springframework.test.context.TestContextManager prepareTestInstance
SEVERE: Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@371bed71] to prepare test instance [null(de.dijon.test.test.AppTest)]
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'de.dijon.test.test.AppTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private de.dijon.test.HelloBean de.dijon.test.test.AppTest.obj; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [de.dijon.test.HelloBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:384)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110)
at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75)
at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:326)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private de.dijon.test.HelloBean de.dijon.test.test.AppTest.obj; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [de.dijon.test.HelloBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:508)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
... 26 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [de.dijon.test.HelloBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1100)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:855)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:480)
... 28 more
Dec 23, 2013 1:31:59 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.support.GenericApplicationContext@2b275d39: startup date [Mon Dec 23 13:31:59 CET 2013]; root of context hierarchy

也许有人可以帮我,告诉我,没有正确自动布线的原因是什么。我在过去的几个小时里试图找出这个问题,但没有任何想法。非常感谢!

您必须使用一个可用的构造型来注释HelloBean

刻板印象的解释:

  • @Service-使用@Service注释所有服务类。你所有的业务逻辑将在服务类中
  • @Repository-用@Repository注释所有DAO类。全部的数据库访问逻辑应该在DAO类中
  • @Component-注释其他组件(例如REST资源类)
  • @Autowired-让Spring使用@Autowired注释

差异

@Component–表示自动扫描组件。@Repository–表示持久层中的DAO组件。@Service–表示业务层中的服务组件。@Controller–表示表示层中的控制器组件。

使用它们的原因

  • 使用@Repository@Service的主要优点CCD_ 15是很容易编写一个AOP切入点,例如用CCD_ 16注释的所有类
  • 您不必在上下文xml文件中编写bean定义。相反注释类并通过自动连接使用这些类
  • 专门的注释有助于清晰地划分应用程序层(在标准的3层应用程序中)

还有

<context:component-scan base-package="de.dijon.test"/>

在测试中,将属性的名称从obj更改为helloBean

如果您在项目中使用maven,则应根据maven项目结构将配置文件存储在类路径中

src/test/resources/application-context.xml

然后将@ContextConfiguration注释更改为

@ContextConfiguration("/application-context.xml")

并再次运行测试。

您的配置文件无法解析,因为默认情况下src/main/webapp/WEB-INF文件夹不在类路径中,配置文件是文件系统文件或项目文件,因此您应该按原样引用它

@ContextConfiguration("file:src/main/webapp/WEB-INF/application-context.xml")

使用

<context:component-scan base-package="de.dijon.test.*"
annotation-config="true" use-default-filters="true" />

在application-context.xml文件中

最新更新