java - 无法调用 "UserRepository.findAll()",因为 "userRepository"为空

标签 java spring spring-boot

我想为我的 Spring 应用程序创建一个登录方法。但是当我尝试打电话时 通过身份验证获取用户 方法,我得到一个空指针异常。这是我的代码: 函数调用错误:

@PostMapping(path = "/online")
public ResponseEntity<?> onlineRequest(@RequestBody OnlineRequest onlineRequest) {
    User user = null;
UserManager userManager = new UserManager();
    user = userManager.getUserByAuthentication(onlineRequest.getUsername(), onlineRequest.getPassword());
    if (user!=null){
        user.setLatestTimeStamp(System.currentTimeMillis());
        return new ResponseEntity<>("You are now online, Enjoy!", HttpStatus.OK);
    } else {
        return new ResponseEntity<>("Invalid login", HttpStatus.valueOf(403));
    }
}

通过身份验证类获取用户:

public class UserManager {
    @Autowired
    private UserRepository userRepository;
    public User getUserByID(int id){
        return userRepository.findById(id).get();
    }
    public User getUserByAuthentication(String name, String password){
        Iterable<User> userList = userRepository.findAll();
        ArrayList<User> users = new ArrayList<>();
        userList.forEach(users::add);
        User user = null;
        for (User u : users){
            if (u.getUsername().equals(name) && u.getPassword().equals(password)){
                user = u;
            }
        }
        return user;
    }
}

存储库:

@Repository
public interface UserRepository extends CrudRepository<User, Integer> {
}

用户类别:

@Entity
@Table
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    //Initialize
    private String username;
    private String password;
    private boolean hasAccess;
    ArrayList<Integer> inChannels;
    long latestTimeStamp;

    public long getLatestTimeStamp() {
        return latestTimeStamp;
    }

    public void setLatestTimeStamp(long latestTimeStamp) {
        this.latestTimeStamp = latestTimeStamp;
    }

    public ArrayList<Integer> getInChannels() {
        return inChannels;
    }

    public void setInChannels(ArrayList<Integer> inChannels) {
        this.inChannels = inChannels;
    }

    public Long getId() {
        return id;
    }

    public User() {
    }

    public boolean hasAccess() {
        return hasAccess;
    }

    public void setAccess(boolean hasAccess) {
        this.hasAccess = hasAccess;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

最佳答案

您不能使用@Autowired没有在 spring 中定义组件的注释之一,因此在您的情况下,您可以使用 @ServiceUserManager像这样:

@Service
public class UserManager {

也不要使用static在你的方法中,你必须注入(inject) UserManager Controller 中的组件,就像您对存储库所做的那样:

@Autowired
private UserManager userManager;

然后你可以使用:

user = userManager.getUserByAuthentication(onlineRequest.getUsername(), onlineRequest.getPassword());
       ^^^^^^^^^^^

关于java - 无法调用 "UserRepository.findAll()",因为 "userRepository"为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74344212/

相关文章:

java - Spring 预定 fixedRateString 作为 Duration

java - 多重继承或多接口(interface)

java.lang.ArrayIndexOutOfBoundsException : 2 error message

java - 异常不起作用(不显示 JOptionPane 消息)

java - 解析复合 json 键

spring - 如何在@InjectMockKs 测试实例中注入(inject)实现列表?

spring-boot - 限制创建没有主体的 session

java - 如何在 Swagger-UI "Value"字段中仅显示必需的参数

spring - 在应用程序启动时将实例注册为 'singleton' bean

java - Spring Boot SPA URL 重写