@Autowired – 没有符合性的beantypes

我通过使用Spring和Hibernate创build实体,服务和JUnittesting来开始我的项目。 所有这一切都很好。 然后我已经添加了spring-mvc来使这个Web应用程序使用许多不同的分步教程,但是当我尝试使用@Autowired注释来制作Controller时,我在部署期间从Glassfish中收到错误。 我想,由于某种原因,spring没有看到我的服务,但经过多次尝试,我仍然无法处理它。

testing与服务

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:/beans.xml"}) 

 @Autowired MailManager mailManager; 

正常工作。

没有@Autowired控制器,我可以打开我的项目在Web浏览器没有任何困难。

/src/main/resources/beans.xml

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"> <context:property-placeholder location="jdbc.properties" /> <context:component-scan base-package="pl.com.radzikowski.webmail"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <!--<context:component-scan base-package="pl.com.radzikowski.webmail.service" />--> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <!-- Persistance Unit Manager for persistance options managing --> <bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> <property name="defaultDataSource" ref="dataSource"/> </bean> <!-- Entity Manager Factory for creating/updating DB schema based on persistence files and entity classes --> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitManager" ref="persistenceUnitManager"/> <property name="persistenceUnitName" value="WebMailPU"/> </bean> <!-- Hibernate Session Factory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--<property name="schemaUpdate" value="true" />--> <property name="packagesToScan" value="pl.com.radzikowski.webmail.domain" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> </props> </property> </bean> <!-- Hibernate Transaction Manager --> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <!-- Activates annotation based transaction management --> <tx:annotation-driven transaction-manager="txManager"/> </beans> 

/webapp/WEB-INF/web.xml

 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="WebApp_ID" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>Spring Web MVC Application</display-name> <servlet> <servlet-name>mvc-dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc-dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> 

/webapp/WEB-INF/mvc-dispatcher-servlet.xml

 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" 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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> <context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> </beans> 

pl.com.radzikowski.webmail.service.AbstractManager

 package pl.com.radzikowski.webmail.service; import org.apache.log4j.Logger; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; /** * Master Manager class providing basic fields for services. * @author Maciej Radzikowski <maciej@radzikowski.com.pl> */ public class AbstractManager { @Autowired protected SessionFactory sessionFactory; protected final Logger logger = Logger.getLogger(this.getClass()); } 

pl.com.radzikowski.webmail.service.MailManager

 package pl.com.radzikowski.webmail.service; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @Component @Transactional public class MailManager extends AbstractManager { // some methods... } 

pl.com.radzikowski.webmail.HomeController

 package pl.com.radzikowski.webmail.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import pl.com.radzikowski.webmail.service.MailManager; @Controller @RequestMapping("/") public class HomeController { @Autowired public MailManager mailManager; @RequestMapping(value = "/", method = RequestMethod.GET) public String homepage(ModelMap model) { return "homepage"; } } 

错误:

 SEVERE: Exception while loading the app SEVERE: Undeployment failed for context /WebMail SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'homeController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: public pl.com.radzikowski.webmail.service.MailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [pl.com.radzikowski.webmail.service.MailManager] 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)} 

对不起,很多代码,但我不知道什么会导致这个错误了。

添加

我已经创build了界面:

 @Component public interface IMailManager { 

增加的工具:

 @Component @Transactional public class MailManager extends AbstractManager implements IMailManager { 

并改变了自动assembly:

 @Autowired public IMailManager mailManager; 

但它仍然会抛出错误(当我用@Qualifier尝试时)

..不能autowire字段:公共pl.com.radzikowski.webmail.service.IMailManager pl.com.radzikowski.webmail.controller.HomeController.mailManager …

我已经尝试了@Component和@Transactional的不同组合。

不应该在web.xml中包含beans.xml吗?

您应该自动assembly接口AbstractManager而不是类MailManager 。 如果您具有不同的AbstractManager实现,则可以编写@Component("mailService")@Autowired @Qualifier("mailService")组合来自动@Autowired @Qualifier("mailService")特定的类。

这是由于Spring基于接口创build和使用代理对象。

我发生这种情况是因为我的testing与我的组件不在同一个软件包中。 (我已经重命名了我的组件包,但不是我的testing包)。我在我的testing@Configuration类中使用了@ComponentScan ,所以我的testing没有find他们依赖的组件。

所以,仔细检查,如果你得到这个错误。

问题是,在服务器启动期间,应用程序上下文和Web应用程序上下文都在WebApplicationContext中注册。 运行testing时,您必须明确指出要加载的上下文。

尝试这个:

 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"classpath:/beans.xml", "/mvc-dispatcher-servlet.xml"}) 

用了很多我的时间! 我的错! 后来发现我宣布注解ServiceComponent的类是abstracttypes的。 已经在Springframework上启用了debugging日志,但没有收到提示。 请检查类是否抽象types。 如果那么应用基本规则,就不能实例化一个抽象类。

你可以尝试注释@Component只有你的具体实现? 也许下面的答案可以帮助。 这是一个类似的问题。 我通常把Spring注释放在实现类中。

https://stackoverflow.com/a/10322456/2619091

最近我遇到了这个问题,事实certificate,我在服务类中导入了错误的注释。 Netbeans有一个隐藏导入语句的选项,这就是为什么我一段时间没有看到它。

我使用@org.jvnet.hk2.annotations.Service而不是@org.springframework.stereotype.Service

正确的方法应该是自动assemblyAbstractManager,正如Max所build议的那样,但是这也应该可以正常工作。

 @Autowired @Qualifier(value="mailService") public MailManager mailManager; 

 @Component("mailService") @Transactional public class MailManager extends AbstractManager { } 

我的猜测是在这里

 <context:component-scan base-package="pl.com.radzikowski.webmail" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> </context:component-scan> 

所有注释首先被use-default-filters =“false”禁用,然后只启用@Controller注释。 因此,您的@Component注释未启用。

如果你正在testing你的控制器。 不要忘记在你的testing类上使用@WebAppConfiguration。

这可以帮助你:

我的项目中有同样的例外。 search后,我发现我缺less@Service注释到我正在实现的接口,我想@Autowired的类。

在您的代码中,您可以将@Service注释添加到MailManager类。

 @Transactional @Serivce public class MailManager extends AbstractManager implements IMailManager {