【问题标题】:How to use @Qualifier with Service and Repository如何将@Qualifier 与服务和存储库一起使用
【发布时间】:2019-12-19 12:46:32
【问题描述】:

我有一个名为 UserRepository 的通用存储库接口。 然后我有一个从名为 MyUserRepository 的接口扩展而来的接口。 它处理一个扩展 User 的 MyUser 类。

我还有一个名为 UserService 的服务接口和一个名为 MyUserServiceImpl 的类。

该服务需要一个 UserRepository 的实例,我虽然可以使用某种注释,例如 @Qualifier,但它不起作用。

@NoRepositoryBean
public interface UserRepository <T extends User> extends JpaRepository<T, Long>{
    <S extends T> S findByLoginName(String loginName);

    <S extends T> S saveAndFlush(User user);
}

@Repository
@Qualifier("myUserRepository")
public interface MyUserRepository extends UserRepository<MyUser> {

}


public interface UserService {

    public List<User> getUsers();
}

@Service
public class MyUserServiceImpl implements UserService {

    @Autowired
    @Qualifier("myUserRepository")
    private UserRepository<User> userRepository;

    @Override
    public List<User> getUsers() {
....
    }

}

应用程序启动失败


说明:

com....services.MyUserServiceImpl 中构造函数的参数0 需要一个 'com....repositories.UserRepository' 类型的 bean 找不到。

注入点有以下注解: - @org.springframework.beans.factory.annotation.Autowired(required=true)

行动:

考虑定义一个 'com....repositories.UserRepository' 类型的 bean 在您的配置中。

【问题讨论】:

    标签: java spring-boot


    【解决方案1】:

    @Qualifier 注解仅在调用已创建的 bean 时使用。所以你不应该打电话给班主任,你可以把它命名为@Repository("myUserRepository")并在@Autowired之后调用它@Qualifier("myUserRepository")

    【讨论】:

    • 我尝试将 repo 索引更改为 @Repository("mylUserRepository") public interface MyUserRepository extends UserRepository { } 但这似乎没有帮助。顺便说一句,我尝试将 Qualifier 和 Autowired 标签的位置从属性更改为设置器。但你是对的。它似乎在创建bean之前寻找它(如果它正在创建)
    • 这个问题可能与 Repository 类的抽象有关吗?
    • @GothsterC 如果您应用此答案,请告诉我是否存在其他问题或是否相同,如果相同,则看起来您正在处理具有引用类型的 bean,然后它没有被扫描,对吧?
    【解决方案2】:

    在你的情况下不需要有限定符。

    @Repository
    public interface MyUserRepository extends UserRepository<MyUser> {
    
    }
    

    将存储库自动连接为:

    @Service
    public class MyUserServiceImpl implements UserService {
    
        @Autowired
        private UserRepository<User> userRepository;
    
        ...
    

    【讨论】:

      【解决方案3】:

      @Qualifier 与@Autowired 注释一起使用。默认情况下,@Autowired 将根据类型注入 bean。当您有多个相同类型的 bean 时,@Qualifier 有助于解决冲突。在您的情况下,使用注释 @Repository 将完成您的工作。同样在您的 UserRepository 接口中,您必须提供 Id 类以及 JPA 实体类。

      【讨论】:

      • 谢谢。我以为我必须从上面的原始代码中提供 Id 类以及 JPA 实体类。有什么问题吗?
      猜你喜欢
      • 1970-01-01
      • 2016-04-04
      • 2015-10-17
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 2019-08-03
      • 2015-12-18
      相关资源
      最近更新 更多