Spring MVC - 静态上下文中的 Autowired Repository NullPointerException

Pat*_*ick 3 java spring spring-mvc autowired

在我的模型中,我有一个名为UserRepository. 另外我有一个UserFacade基本上将用户添加到存储库并由控制器访问的。该 repo@Autowired位于 Facade 中。当我想添加一个新用户时,我会收到存储库的 nullPointerException。

我的spring-servlet.xml包含所需的

<jpa:repositories base-package="project.user.repositories" />

而存储库是包含UserRepository.java. 它扩展了 CrudRepository:

@Repository
public interface UserRepository extends CrudRepository<User, Long> {
    User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

Facade.java 是包含存储库的对象:

public class UserFacade {
    @Autowired
    private static UserRepository userRepo;

    private static Logger logger = LoggerFactory.getLogger(UserFacade.class);

    public UserFacade(){} //Thought it might work if I add a constructor and call it?

    public static User findByUsername(String username) {
        logger.debug(username+userRepo);  // prints SomeStringnull
        return userRepo.findByUsername(username); //NullPointerException
    }
}
Run Code Online (Sandbox Code Playgroud)

从我的角度来看,我controller有一个方法,例如:

@RequestMapping(value = CONTEXT)
public String test(){
    User user = UserFacade.findByUsername("get"); 
    //obviously user will be null if there is no such user
    return "success";
}
Run Code Online (Sandbox Code Playgroud)

导入应该不会成为问题,因为我使用的是 Android Studio。我错过了什么?

注意:相关问题有很多很好的答案(比如这个),但每个都有自己的不同背景,对我没有帮助。

Roh*_*ain 6

Spring 不会自动装配static字段。这就是为什么userRepofield 是null. 一种方法是自己制作UserFacade一个bean,然后你可以制作userRepo一个非静态字段。我更喜欢这种方式。UserFacade不应该是一个实用程序类,因为它正在与存储库 bean 进行交互。把它做成豆子会更有意义。

另一种选择是提供一个二传手,并@Autowired在其上使用:

@Autowired
public void setUserRepo(UserRepository userRepo) {
    UserFacade.userRepo = userRepo;
}
Run Code Online (Sandbox Code Playgroud)

或者甚至在参数化构造函数上使用它也可以。