Spring Data Autowiring:使用@Autowired的两个bean候选者

时间:2015-05-06 05:00:04

标签: java spring intellij-idea repository

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

@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 );

}

存储库在我的AppConfiguration-Class中配置:

@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 个答案:

答案 0 :(得分:0)

通常,当您为同一类型定义了2个bean时会发生错误there are TWO bean candidates,因此在运行时spring需要一种方法来识别您真正想要在此属性中自动装配的bean,

为此,我们使用注释@Qualifier,在参数中,我们需要提供我们想要自动装配的bean的名称。

希望这有帮助!

祝你好运!

答案 1 :(得分:0)

不应该注释UserRepository接口,在您的情况下,其他bean候选者将是 SimpleJpaRepository ,这与您的 UserRepository 相冲突。 由于您通过配置类上的 @EnableJpaRepositories 注释启用存储库,因此仅扩展Spring存储库接口应该足够了,因此您的存储库看起来像:

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 );

}

另一方面,应该在调用存储库的insert(实体)/ save(实体)/ find()/ delete(实体)方法的服务方法上使用@Transactional。