首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring引导无法调用Repository,因为Repository为null

spring引导无法调用Repository,因为Repository为null
EN

Stack Overflow用户
提问于 2021-10-13 16:39:08
回答 3查看 6.3K关注 0票数 0
代码语言:javascript
复制
public class UserList {

    private  String id;
    private String email;
    private String userType;
    private String rolls;
    private String partner;
    private Integer customersLinked;
    private String position;
    private String status;

    @Autowired
    ICustomerRepository customerRepository;

    public UserList (Users user){
        this.id = user.getId();
        this.email = user.getEmail();
        this.userType = user.getUserType();
        this.rolls = user.getRolls();
        this.partner = user.getPartner();

       List<Customer> customersLinked = customerRepository.findAllByLinkedUsersIn(user.getId());
        this.customersLinked = 0;
        this.position = user.getPosition();
        this.status =user.getStatus();
    }

    //Getter and Setter
}

该类用作frontEnd中的列表,获取特定数据,而不是发送所有数据。

代码语言:javascript
复制
 @RequestMapping(value = "usersLinked/{id}/{type}", method = RequestMethod.GET)
    public Object getUsersLinkedById(@PathVariable("id") String id,@PathVariable("type") Integer type) {
        List<String> users = null;
        switch (type) {
            case 0:
                users = usersRepository.findAll().stream().map(m -> m.getId()).collect(Collectors.toList());
                break;
        }
        //Add userList
      List<UserList> userList = new ArrayList<>();
            if(users != null)
                {
                    users.forEach(userId ->
                    {
                        Optional<Users> user = this.usersRepository.findById(userId);
                          userList.add(new UserList(user.get()));
                    });
            }
        return userList;
    }
}

从上面可以看到,我正在调用用户存储库中的所有数据,并将列表发送给它。

我的客户信息库

代码语言:javascript
复制
public interface ICustomerRepository extends MongoRepository<Customer, String> {


    Customer findByBusinessInformation_businessName(String businessName);

    List<Customer> findByBusinessInformation_partnerAssigned(String partnerAssigned);

    @Query("{ 'LinkedUsers' : ?0 }")
    Customer findByLinkedUsers(String id);

    List<Customer> findAllByLinkedUsersIn(String id);
}

在userList中,当我添加逻辑wityh customerRepository时会出现错误,没有存储库,一切都正常工作(希望使用存储库获取一个客户数组,然后获取数组的大小()并将其添加到linkedCustomers中)。我是不是错过了

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-10-13 19:23:23

您正在尝试使用自动备注注入字段customerRepository,但您的类是不可注入的。

  • 您可以在类UserList
  • 上添加注释@Repository,或者使用构造函数注入(更好的注入bean的方法)
票数 1
EN

Stack Overflow用户

发布于 2021-10-13 17:29:03

您可能在存储库类的顶部缺少了@存储库注释。

另一个不相关的建议词:

在控制器中,您可以在java中使用findAll和filter来只保留ids。然后转到同一个存储库,并从上面的每个用户id执行另一个查询。这会导致您创建多个数据库调用,这是您可以执行的最昂贵的操作之一,当您已经拥有来自第一个查询的所有数据时.

另外,如果您只查看函数的底部,而不需要对每个用户id进行查询(当您有一个用户id列表作为输入时),您可以创建一个使用'in‘约定的查询,并传递一个用户id列表来创建单个db调用。

票数 0
EN

Stack Overflow用户

发布于 2021-10-13 19:10:59

首先,我将在@Autowired ICustomerRepository customerRepository;类中去掉UserList。它不属于那里。应该在ICustomerRepository中执行链接客户的计数,并通过构造函数将结果传递到UserList

例如:

代码语言:javascript
复制
public class UserList {

    private  String id;
    private String email;
    private String userType;
    private String rolls;
    private String partner;
    private Long customersLinked; //better use Long instead of Integer
    private String position;
    private String status;


    // constructor takes the number of linked customers as parameter
    public UserList (Users user, Long customersLinked ) { 
        this.id = user.getId();
        this.email = user.getEmail();
        this.userType = user.getUserType();
        this.rolls = user.getRolls();
        this.partner = user.getPartner();
        this.customersLinked = customersLinked;
        this.position = user.getPosition();
        this.status =user.getStatus();
    }

    //Getter and Setter
}

然后在ICustomerRepository中创建计数查询

例如:

代码语言:javascript
复制
public interface ICustomerRepository extends MongoRepository<Customer, String> {
    //other methods

    Long countByLinkedUsersIn(String id); //not so sure if this query works in mongo
}

最后在你的控制器里

代码语言:javascript
复制
Optional<Users> user = this.usersRepository.findById(userId);
Long count = this.usersRepository.countByLinkedUsersIn(userId);
userList.add(new UserList(user.get(), count));

我对查询方法有疑问:Long countByLinkedUsersIn(String id);。通常,当存储库方法在其名称中包含" in“时,countByLinkedUsersIn,将被期望作为一个列表而不是单个用户id作为参数。但是,如果您以前的方法List<Customer> findAllByLinkedUsersIn(String id);对您有效,那么这个方法也应该有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69559218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档