Null repository even with @Autowired implemented

Tags: , , , ,



I have the following controller.

The following line works just fine:

user = userRepository.selectUserByLogin(name);

It correctly returns the user.

@Controller
public class TestController {

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(method = RequestMethod.GET, value = "/testpage")
    public String initTest() {

        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String name = user.getUsername();
        
        User user = new User();
        user = userRepository.selectUserByLogin(name);

        return "";
    }
}

Now I want to move that code to a getLoggedUser method of a “Utilities” class. This is how I did it.

Controller

@Controller
public class TestController {

    @RequestMapping(method = RequestMethod.GET, value = "/testpage")
    public String initTest() {
        
        Utilities utilities = new Utilities();

        User user = new User();
        user = utilities.getLoggedUser();

        return "";
    }
}

Utilities

public class Utilities {
    
    @Autowired
    private UserRepository userRepository;  
    
    public User getLoggedUser() {
        
        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        String name = user.getUsername();
        
        User user = new User();
        user = userRepository.selectUserByLogin(name);
        
        return user;
    }
}

But when that is executed I’m getting the following error:

Cannot invoke “UserRepository.selectUserByLogin(String)” because “this.userRepository” is null.

Why is it null if it is with the @Autowired notation? Looks the same as in the original implementation that worked.

Answer

Spring is not going to be able to autowire your repository if you create an instance of Utilities class with new like: Utilities utilities = new Utilities();

In order to do so you will have to add @Component or @Service annotation to your Utilities class:

@Component
public class Utilities {

and then autowire it into your controller:

@Controller
public class TestController {

    @Autowired
    private Utilities utilities;

    @RequestMapping(method = RequestMethod.GET, value = "/testpage")
    public String initTest() {
        User user = new User();
        user = utilities.getLoggedUser();

        return "";
    }
}


Source: stackoverflow