【问题标题】:Error creating bean with name : Unsatisfied dependency expressed through field使用名称创建 bean 时出错:通过字段表示的不满足依赖关系
【发布时间】:2023-03-25 07:50:02
【问题描述】:

控制器

@Controller
public class AccountController {

    @Autowired
    AccountService accountService;

服务

@Service
public class AccountServiceImpl implements AccountService {

    @Autowired
    AccountDAO accountDao;
    
    
    //since we have added support for transaction manager
    //@Transactional is use to automatically begin and end transaction
    
    @Override
    @Transactional
    public boolean saveAccount(Account account) {
        return accountDao.saveAccount(account);
        //return false;
        // TODO Auto-generated method stub
        //return accountDao.saveAccount(account);
    }

DAO

@Repository
public class AccountDAOImpl implements AccountDAO {
    
    //we r @Autowiring sessionFactory cuz hibernate use sessionFactory for db connectivity
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public boolean saveAccount(Account account) {
        boolean saveFlag = true;
        
        AccountEntity accountEntity = new AccountEntity();
        accountEntity.setAccountNo(account.getAccountNo());
        accountEntity.setAccountHolderName(account.getAccountHolderName());
        accountEntity.setAccountType(account.getAccountType());
        accountEntity.setAccountBalance(account.getAccountBalance());
        accountEntity.setDateOfBirth(account.getDateOfBirth());
        accountEntity.setPsCode(account.getPsCode());
        
        try {
            Session currentSession = sessionFactory.getCurrentSession();
            currentSession.save(accountEntity);
        } catch (Exception e) {
            e.printStackTrace();
            saveFlag = false;
        }
        
        return saveFlag;
    }

.xml

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/psbankdb?useSSL=false" />
        <property name="user" value="psbankdb" />
        <property name="password" value="123" />
    </bean>
    
    <!-- sessionFactory is used to connect with db using above dataSource(ref="dataSource)" -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="packagesToScan" ref="com.ps.springmvc.psbankApp" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <!-- to display sql property on the console while execution -->
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>
    
    <!-- TransactionManager it uses session factory as ref -->
    <bean id="myTransactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    
    <!-- it allow us to use annotation to eliminate manual coding to start and stop transaction -->
    <tx:annotation-driven transaction-manager="myTransactionManager" />

低于错误

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“accountController”的bean时出错:通过字段“accountService”表示不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“accountServiceImpl”的 bean 时出错:通过字段“accountDao”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为 'accountDAOImpl' 的 bean 时出错:通过字段 'sessionFactory' 表达的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源 [/WEB-INF/bankAppContext.xml] 中定义的名称为“sessionFactory”的 bean 时出错:无法解析对 bean 'com.ps.springmvc.psbankApp' 的引用同时设置 bean 属性“packagesToScan”;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'com.ps.springmvc.psbankApp' available org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:643) org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130) org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1422) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)

【问题讨论】:

  • 什么是 com.ps.springmvc.psbankApp?
  • 包含控制器、服务、模型、DAO 等的包
  • 您正在使用&lt;property name="packagesToScan" ref="com.ps.springmvc.psbankApp" /&gt; ,我非常怀疑您的上下文中有一个名为com.ps.springmvc.psbankApp 类型为String 的bean。将ref 更改为value

标签: java spring spring-mvc


【解决方案1】:

您收到此错误是因为 spring boot 在启动时找不到 AccountService bean。

[spring-docs][of] NoSuchBeanDefinitionException 解释

当 BeanFactory 被要求提供 bean 实例时抛出异常 它找不到定义。这可能指向一个不存在的 bean、非唯一 bean 或手动注册的单例实例 没有关联的 bean 定义。

所以简而言之,bean 没有在您的案例中注册。 您可以按照以下方法之一注册 bean 并解决此问题。

  1. @Configuration 类中声明@Bean 方法或在XML 中添加标签&lt;bean&gt; 配置。
  2. @Component@Service 可以通过以下方式注册到 spring bean-factory 通过 XML 配置中的 @ComponentScan&lt;context:component-scan ... /&gt;

【讨论】:

  • 问题是使用ref 而不是value。我建议在构建答案之前阅读堆栈跟踪。
猜你喜欢
  • 2018-05-04
  • 2019-02-22
  • 2019-10-11
  • 2021-07-23
  • 2020-11-25
  • 2017-05-15
  • 2018-03-19
  • 2021-06-23
  • 2019-08-08
相关资源
最近更新 更多