java spring Boot 无法调用Repository,因为Repository为null

3gtaxfhh  于 2023-03-28  发布在  Java
关注(0)|答案(4)|浏览(482)
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中用作列表,获取特定数据,而不是发送所有数据

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

正如你从上面看到的,我从用户存储库调用所有的数据,并将列表发送给它
我的客户存储库

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中,当我使用customerRepository添加逻辑时,我得到了错误,没有存储库,一切都在工作(希望使用存储库获取customer数组,然后获取数组的size()并将其添加到linkedCustomers)。

oxcyiej7

oxcyiej71#

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

  • 您可以在类UserList上添加一个注解@Repository
  • 或者使用构造函数注入(注入bean的更好方法)
ua4mk5z4

ua4mk5z42#

您可能缺少了存储库类顶部的**@repository**注解。
另一个无关的忠告:
在你的控制器中,你使用findAll和filter在java中只保留id。然后你去同一个仓库,并从上面每个用户id执行另一个查询。这是一个导致你创建多个数据库调用,这是你可以做的最昂贵的操作之一,当你已经从第一个单一的查询中获得了所有数据时。
此外,如果你只查看函数的底部,你不需要每个用户ID的查询(当你有一个用户ID列表作为输入时),你可以创建一个使用'in'约定的查询,并传递一个用户ID列表来创建一个单独的db调用。

1wnzp6jl

1wnzp6jl3#

首先,我会在UserList类中删除@Autowired ICustomerRepository customerRepository;。它不属于那里。链接客户的计数应该在ICustomerRepository中执行,结果通过构造函数传递给UserList
例如

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中创建count查询
例如

public interface ICustomerRepository extends MongoRepository<Customer, String> {
    //other methods

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

最后在你的控制器里

Optional<Users> user = this.usersRepository.findById(userId);
Long count = this.usersRepository.countByLinkedUsersIn(userId);
userList.add(new UserList(user.get(), count));

P.S.我对查询方法有疑问:Long countByLinkedUsersIn(String id);。通常,当存储库方法的名称中包含“In”时,countByLinkedUsersIn,则它应该作为List的参数,而不是单个用户ID。* 然而 * 如果您以前的方法List<Customer> findAllByLinkedUsersIn(String id);适用于您,那么这个方法也应该适用。

m0rkklqb

m0rkklqb4#

我认为你需要在资源类中为仓库示例添加一个构造函数。

相关问题