spring 启动无法调用存储库,因为存储库为空
spring boot Cannot invoke Repository because Repository is null
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
}
这个class在前端用作列表,获取特定数据,而不是发送所有数据
@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)。我错过了什么吗
您可能缺少存储库顶部的 @repository 注释 class。
另一个不相关的忠告:
在您的控制器中,您使用 java 中的 findAll 和过滤器来仅保留 ID。
然后您转到同一个存储库并从上面的每个用户 ID 执行另一个查询。
这会导致您创建多个数据库调用,这是您可以执行的最昂贵的操作之一,当您已经拥有来自第一个查询的所有数据时...
此外,如果您只查看函数的底部,您甚至不需要针对每个用户 ID 进行查询(当您有一个用户 ID 列表作为输入时),您可以创建一个查询使用 'in' 约定并传递用户 ID 列表以创建单个数据库调用。
首先,我会在 UserList
class 中删除 @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));
P.S。我对查询方式有疑问:Long countByLinkedUsersIn(String id);
。通常当存储库方法的名称中有“In”时,countByLinkedUsersIn,那么它应该作为参数列表而不是单个用户 ID。 但是如果您之前的方法List<Customer> findAllByLinkedUsersIn(String id);
对您有效,那么这个方法也应该有效。
您正在尝试使用自动装配注解注入字段 customerRepository,但您的 class 不可注入。
- 您可以在 class UserList
上添加注解 @Repository
- 或者使用构造函数注入(注入 bean 的更好方法)
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
}
这个class在前端用作列表,获取特定数据,而不是发送所有数据
@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)。我错过了什么吗
您可能缺少存储库顶部的 @repository 注释 class。
另一个不相关的忠告:
在您的控制器中,您使用 java 中的 findAll 和过滤器来仅保留 ID。 然后您转到同一个存储库并从上面的每个用户 ID 执行另一个查询。 这会导致您创建多个数据库调用,这是您可以执行的最昂贵的操作之一,当您已经拥有来自第一个查询的所有数据时...
此外,如果您只查看函数的底部,您甚至不需要针对每个用户 ID 进行查询(当您有一个用户 ID 列表作为输入时),您可以创建一个查询使用 'in' 约定并传递用户 ID 列表以创建单个数据库调用。
首先,我会在 UserList
class 中删除 @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));
P.S。我对查询方式有疑问:Long countByLinkedUsersIn(String id);
。通常当存储库方法的名称中有“In”时,countByLinkedUsersIn,那么它应该作为参数列表而不是单个用户 ID。 但是如果您之前的方法List<Customer> findAllByLinkedUsersIn(String id);
对您有效,那么这个方法也应该有效。
您正在尝试使用自动装配注解注入字段 customerRepository,但您的 class 不可注入。
- 您可以在 class UserList 上添加注解 @Repository
- 或者使用构造函数注入(注入 bean 的更好方法)