【问题标题】:spring boot Cannot invoke Repository because Repository is nullspring boot 无法调用存储库,因为存储库为空
【发布时间】:2021-10-13 16:39:08
【问题描述】:
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
}

这个类在前端用作列表,获取特定数据,而不是发送所有数据

 @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 添加逻辑时出现错误,没有存储库,一切正常(想使用存储库获取客户数组,然后获取数组的 size() 并添加它给linkedCustomers)。我是不是错过了什么

【问题讨论】:

  • UserList 不是 spring bean,所以你不能 @Autowire 存储库到它(它将始终为空)。
  • 正如@pleft 所说,您缺少UserListICustomerRepository 的bean 定义。那应该可以解决您的问题。
  • @pleft ,感谢您的回复,所以我应该将我的 userList 类更改为 bean 类型。对我应该做什么有点困惑

标签: java spring spring-boot repository


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    另一个不相关的忠告:

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

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

    【讨论】:

      【解决方案3】:

      首先我会在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中创建计数查询

      例如

      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));
      

      附:我对查询方法有疑问:Long countByLinkedUsersIn(String id);。通常,当存储库方法的名称中包含“In”时,countByLinkedUsersIn,那么它应该作为参数列表而不是单个用户 ID。 但是如果您之前的方法List&lt;Customer&gt; findAllByLinkedUsersIn(String id); 对您有效,那么这个方法也应该有效。

      【讨论】:

        猜你喜欢
        • 2017-10-25
        • 1970-01-01
        • 2021-11-07
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-28
        相关资源
        最近更新 更多