value of findByUsername is null

39 Views Asked by At

UserServiceImpl

package customlogin.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import customlogin.dto.UserDto;
import customlogin.model.User;
import customlogin.repositories.UserRepository;


@Service
public class UserServiceImpl  implements UserService{
    
    
    @Autowired
    PasswordEncoder passwordEncoder;
    
    private UserRepository userRepository;
    
    

    public UserServiceImpl(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public User findByUsername(String username) {
        
        return userRepository.findByUsername(username);
    }

    @Override
    public User save(UserDto userDto) {
        User user = new User(userDto.getFullname(), userDto.getDateofbirth(), userDto.getGender(), userDto.getAddress(), userDto.getCity(), userDto.getState(), userDto.getUsername(),passwordEncoder.encode(userDto.getPassword()));
        return userRepository.save(user);
    }

}

UserService

package customlogin.service;

import customlogin.dto.UserDto;
import customlogin.model.User;

public interface UserService {
    
    User findByUsername(String username);
    User save(UserDto userDto);

}

UserRepository

package customlogin.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import customlogin.model.User;


@Repository
public interface UserRepository  extends JpaRepository<User, Long>{
    
    User findByUsername(String username);

}

Whenever i am logging with correct username and password error appears in console that this.userRepository is null

Error:

Caused by: java.lang.NullPointerException: Cannot invoke "customlogin.repositories.UserRepository.findByUsername(String)" because "this.userRepository" is null at customlogin.service.CustomUserDetailsServices.loadUserByUsername(CustomUserDetailsServices.java:26) ~[classes/:na] at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:103) ~[spring-security-core-6.2.1.jar:6.2.1] ... 65 common frames omitted

1

There are 1 best solutions below

0
Robert On

As you mentioned, userRepository is null beacuse it is not injected.

Add @Autowired annotation or make it final and add to constructor to do that.

Better way is Constructor-based injecttion like in example below. To find out how it works and what types of dependency injection are, read https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html#beans-dependency-resolution (Constructor-based or setter-based DI?)

package customlogin.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import customlogin.dto.UserDto;
import customlogin.model.User;
import customlogin.repositories.UserRepository;


@Service
public class UserServiceImpl implements UserService {
    
    private final PasswordEncoder passwordEncoder;
    private final UserRepository userRepository;

    public UserServiceImpl(PasswordEncoder passwordEncoder, UserRepository userRepository) {
        this.passwordEncoder = passwordEncoder;
        this.userRepository = userRepository;
    }

    @Override
    public User findByUsername(String username) {  
        return userRepository.findByUsername(username);
    }

    @Override
    public User save(UserDto userDto) {
        User user = new User(userDto.getFullname(), userDto.getDateofbirth(), userDto.getGender(), userDto.getAddress(), userDto.getCity(), userDto.getState(), userDto.getUsername(),passwordEncoder.encode(userDto.getPassword()));
        return userRepository.save(user);
    }

}