【问题标题】:No qualifying bean of type available (Spring Data)没有可用类型的合格 bean (Spring Data)
【发布时间】:2023-03-12 20:45:01
【问题描述】:

当我尝试自动装配扩展 CrudRepository 的接口时出现此错误。我有两个用于 2 个数据库的休眠 xml 配置。完整的堆栈是

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名为“helloController”的bean时出错:通过字段“stockService”表示的依赖关系不满足;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.publishing.test.stock.services.StockService”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)} org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)

<hibernate-configuration>

<session-factory>

    <!-- Database connection settings -->
    <property name="connection.driver_class">org.postgresql.Driver</property>
    <property name="connection.url"></property>
    <property name="connection.username"></property>
    <property name="connection.password"></property>

    <!-- JDBC connection pool (use the built-in) -->
     <property name="connection.pool_size">100</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.PostgreSQL95Dialect</property>

    <!-- Disable the second-level cache -->
    <!--<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>-->

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop the existing table and create new one -->
    <property name="hbm2ddl.auto">update</property>

    <property name="packagesToScan">com.publishing</property>

    <!-- Mention here all the model classes -->
    <mapping class="com.publishing.models.Stock"/>

</session-factory>

@Controller
public class HelloController {


@Autowired
private StockService stockService;

我在 Spring Config 中也有 3 行

<context:component-scan base-package="com.publishing" />
<context:annotation-config />
<jpa:repositories base-package="com.publishing" />

服务是

@Service("StockService")
public interface StockService extends CrudRepository<Stock, Long> {

编辑:

好的,现在我们已经编辑了hibernate.cfg.xml

    <!-- Drop the existing table and create new one -->
    <property name="hbm2ddl.auto">update</property>

    <!--<property name="packagesToScan">com.publishing</property>-->

    <!-- Mention here all the model classes -->
    <mapping class="com.publishing.models.Stock"/>

还有服务

@Service("stockService")
public interface StockService extends CrudRepository<Stock, Long> {

【问题讨论】:

  • 这是因为你的 bean/service 应该与控制器中的实例命名完全相同,它是区分大小写的。
  • 我做了,还是一样的错误
  • 能否请您在您的项目中显示扫描包配置?
  • 现在它说“无法自动装配 StockService 类型的 bean 不止一个”扫描包?!你是这个意思?!
  • 是的,我就是这个意思。我希望这就是您的服务所在的软件包?

标签: java spring dependency-injection dependencies spring-data-jpa


【解决方案1】:

这是因为您将 bean 定义为 StockService 并且您将其称为 stockService,这应该是相同的名称,在服务和控制器中都区分大小写。

所以 bean 定义应该从以下位置更新:

@Service("StockService")

收件人:

@Service("stockService")

因为您在控制器中使用stockService 引用它:

@Autowired
private StockService stockService;

注意:

还要确保你的 bean 是在 spring 的扫描包中定义的。

【讨论】:

  • 我可能错了,但我认为没有指定 @Qualifier,Spring 应该尝试按类型自动装配 StockService,名称应该无关紧要。
  • @LazerBass 实际上,它会按照@Sevice 级别中指定的名称自动装配,这与iiving @Qualifier 相同。
  • @LazerBass 很高兴它有帮助,您可以查看this article 了解更多信息,这很有趣。
  • 我只在 spring-root.xml 中使用休眠配置通过在 bean 中配置休眠属性来做到这一点。那么我们可以让它只与 hibernate.cfg.xml 一起工作吗?!
  • @Nesquik27 在那种情况下,这是我无法帮助的另一件事,对不起,我不知道。
猜你喜欢
  • 2018-04-20
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 2020-05-24
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多