我有一个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它不起作用。
我真的不知道发生了什么。
非常感谢任何帮助。
答案 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。