如何在服务和存储库中使用@Qualifier

时间:2019-08-13 00:09:21

标签: java spring-boot

我有一个称为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   在您的配置中。

3 个答案:

答案 0 :(得分:1)

@Qualifier注释仅在调用已创建的bean时使用。因此,您不应调用类头,可以将其命名为@Repository("myUserRepository"),然后在@Autowired @Qualifier("myUserRepository")

之后调用

答案 1 :(得分:0)

您的案件不需要限定词。

@Repository
public interface MyUserRepository extends UserRepository<MyUser> {

}

将存储库自动连线为:

@Service
public class MyUserServiceImpl implements UserService {

    @Autowired
    private UserRepository<User> userRepository;

    ...

答案 2 :(得分:0)

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