当前位置: 首页 > 知识库问答 >
问题:

Spring数据自动连接:使用@Autowired的两个bean候选者

端木令
2023-03-14

我有一个使用Spring Data从JPARepository派生的UserRepository:

@Transactional
@Repository( value = "userRepo")
@RepositoryDefinition( idClass = Integer.class , domainClass = info.frankmarx.model.User.class  )
public interface UserRepository extends JpaRepository< User , Integer > {

@Transactional(isolation = Isolation.READ_COMMITTED )
User findUserByUserName( String userName );

@Query( "select u from User u where u.isExpired = false and u.isDeleted = false and u.userName = ?1" )
User findActiveUserByName( String userName );

}

存储库在my AppConfiguration类中配置:

@Configuration
@EnableJpaRepositories(value = "info.frankmarx.repository" , entityManagerFactoryRef = "entityManagerFactory" , transactionManagerRef = "transactionManager")
@EnableVaadin
public class AppConfiguration {

@WebListener( )
public static class MyContextLoaderListener extends ContextLoaderListener {

}
...
}

applicationContext中还有组件扫描等功能。xml:

<context:component-scan base-package="info.frankmarx"/>
<context:annotation-config/>
<tx:annotation-driven transaction-manager="transactionManager"/>

但当我想将此存储库自动连接到这样的服务时:

@Autowired
private UserRepository userRepository;

我总是在Intellij中得到错误消息,有两个bean候选,我应该使用限定符注释:

@Qualifier("userRepository")
@Autowired
private UserRepository userRepository;

如果我使用限定符,那么它是有效的。

但我不知道为什么没有@Qualifier它就不起作用。

我真的不知道发生了什么。

非常感谢您的帮助。

共有2个答案

潘智刚
2023-03-14

UserRepository接口不应该被注释,在您的例子中,另一个候选bean是SimpleParepository,它与您的UserRepository冲突。仅扩展spring Repository接口就足够了,因为您是通过配置类上的@EnableJpaRepositories注释启用存储库的,所以存储库看起来像:

public interface UserRepository extends JpaRepository< User , Integer > {

User findUserByUserName( String userName );

@Query( "select u from User u where u.isExpired = false and u.isDeleted = false and u.userName = ?1" )
User findActiveUserByName( String userName );

}

另一方面,应在调用存储库的插入(实体)/保存(实体)/查找()/删除(实体)方法的服务方法上使用@Transactional。

谷梁宁
2023-03-14

一般来说,当您为同一类型定义了2个bean时,就会出现错误有两个bean候选人,因此在运行时,Spring需要一种方法来确定您真正想要在该属性中自动连接的bean,

为此,我们使用注释@Qualifer,在这个bean的参数中,我们需要提供我们想要自动连接的bean的名称。

希望这有帮助!

祝你好运!

 类似资料:
  • 有没有可能让一个Spring Bean实现两个接口,并能够使用任何一个接口自动连接Bean? 一个实现两个服务的类 我正在获取: 原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到依赖项[ServiceB]的[ServiceB]类型的合格bean:需要至少有一个bean可以作为此依赖项的自动候选项。依赖项批注

  • 我是Spring的新手。我正面临Spring-Boot的问题。我正在尝试将外部配置文件中的字段自动装配到自动装配的bean中。我有以下类 应用程序。Java语言 AppConfig。Java语言 服务接口 服务1 我无法在App类的postconstruct方法中显示服务名称变量。我这样做对吗?

  • 我有两个类CustomerDAOImpl和UserDAOImpl,都用@Repository注释进行了注释。我在每个类中定义了@bean并自动连接。 与此完全相同,我在UserDAOImpl类方法中定义、自动连接和使用了以下bean(这里只显示bean定义和自动连接代码,以保持简洁): 现在这两个DAO bean都在我的服务类OrderServiceImpl(用@service注释)中自动连接;下

  • 问题内容: 背景: 我有一个Spring 2.5 / Java / Tomcat应用程序。下面的bean在整个应用程序中的许多地方都使用过 以下是新的bean: 第一个bean的配置如下(包含了软件包中的所有bean) 第二个(新)bean是单独配置的 启动服务器时,这(当然)会导致异常: 从试图像这样自动装配bean的类中 因为有两个bean实现相同的接口。 问题: 是否可以配置Bean,以便

  • 我有一个spring 2.5/Java/Tomcat应用程序。下面有一个bean,在整个应用程序的许多地方都使用了这个bean 和以下新bean: 第一个bean是这样配置的(包中的所有bean都包含在内) 第二个(新的)bean是单独配置的 这会导致(当然)启动服务器时出现异常: 嵌套异常为org.springframework.beans.factory.NoSuchBeanDefinitio

  • 我通过Spring Boot 1.1.8使用Spring 4,并创建了一个类来缓存一些数据。这个类依赖于泛型来工作,但我在Spring和将这个类自动连接为另一个服务中的bean方面遇到了问题。 我会遇到如下错误: 所涉及的班级: 类BaseRepository扩展JpaRepository如下。其他实际存储库扩展了这个。 BaseWithName类是一个MappedSuperclass,它定义名称