@Autowired - 没有为依赖项找到类型的限定bean

 我不是咸鱼仔 发布于 2023-02-13 13:31

我通过使用Spring和Hibernate为服务创建实体,服务和JUnit测试来启动我的项目.所有这一切都很棒.然后我添加了spring-mvc来使用许多不同的分步教程来创建这个Web应用程序,但是当我尝试使用@Autowired注释创建Controller时,我在部署期间遇到来自Glassfish的错误.我想由于某些原因Spring没有看到我的服务,但经过多次尝试后我仍然无法处理它.

服务测试

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

@Autowired
MailManager mailManager;

工作正常.

没有@Autowired的控制器,我可以毫无困难地在Web浏览器中打开我的项目.

/src/main/resources/beans.xml





    

    
        
    

    

    
        
        
        
        
    

    
    
        
    

    
    
        
        
    

    
    
        
        
        
        
            
                org.hibernate.dialect.MySQLDialect
            
        
    

    
    
        
    

    
    


/webapp/WEB-INF/web.xml


    Spring Web MVC Application
    
        mvc-dispatcher
        org.springframework.web.servlet.DispatcherServlet
        1
    
    
        mvc-dispatcher
        /
    
    
        contextConfigLocation
        /WEB-INF/mvc-dispatcher-servlet.xml
    
    
        org.springframework.web.context.ContextLoaderListener
    

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



    
        
    

    

    
        
        
    


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 
 */
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)}

很抱歉有很多代码,但我不知道是什么原因造成了这个错误.

添加

我创建了界面:

@Component
public interface IMailManager {

添加工具:

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

并更改了自动装配:

@Autowired
public IMailManager mailManager;

但它仍然会引发错误(当我尝试使用@Qualifier时)

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

我也试过了@Component和@Transactional的不同组合.

我不应该以某种方式在web.xml中包含beans.xml吗?

4 个回答
  • 您应该自动连接接口AbstractManager而不是类MailManager.如果您有不同的实现,AbstractManager您可以编写@Component("mailService")然后@Autowired @Qualifier("mailService")组合以自动装配特定的类.

    这是因为Spring根据接口创建并使用代理对象.

    2023-02-13 13:32 回答
  • 我发生这种情况是因为我的测试与我的组件不在同一个包中.(我已经重命名了我的组件包,但不是我的测试包.)而且我@ComponentScan在我的测试@Configuration类中使用,所以我的测试没有找到他们所依赖的组件.

    所以,仔细检查一下,如果你收到这个错误.

    2023-02-13 13:32 回答
  • 花了很多时间在这上面!我的错!后来发现我声明了注释的类ServiceComponent类型为abstract的类.已在Springframework上启用调试日志但未收到任何提示.请检查类是否为抽象类型.如果那时,应用了基本规则,则无法实例化抽象类.

    2023-02-13 13:33 回答
  • 问题是在服务器启动期间,应用程序上下文和Web应用程序上下文都在WebApplicationContext中注册.运行测试时,必须明确指出要加载的上下文.

    试试这个:

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

    2023-02-13 13:33 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有