Spring MVC - Autowired存储库静态上下文中的NullPointerException
问题描述:
在我的模型中,我有一个名为UserRepository
的存储库。此外,我有一个UserFacade
,基本上将用户添加到存储库并由Controller访问。回购是门面的@Autowired
。当我想添加一个新用户时,我得到一个存储库的空指针异常。Spring MVC - Autowired存储库静态上下文中的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);
}
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
}
}
从我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";
}
进口将不应该是一个问题因为我正在使用Android Studio。我错过了什么?
注意:对于相关问题(如this one)有很多很好的答案,但每个都有自己的,不同的上下文,并没有帮助我。
答
春天不autowire static
字段。这就是为什么userRepo
字段是null
。一种方法是将UserFacade
作为一个bean本身,然后可以使userRepo
成为一个非静态字段。我更喜欢这种方式。 UserFacade
不应该是一个实用类,因为它正在与存储库bean进行交互。把它变成豆子会更有意义。
另一种选择是提供了一个二传手,并使用对@Autowired
:
@Autowired
public void setUserRepo(UserRepository userRepo) {
UserFacade.userRepo = userRepo;
}
或将其即使在参数的构造函数会工作。
可能重复的[为什么我的Spring @Autowired字段为空?](http://*.com/questions/19896870/why-is-my-spring-autowired-field-null) –
@SotiriosDelimanolis这就是我也一直在想,直到我读到它(这就是为什么我把它和我的问题联系起来)。 – Patrick
对。这不是一个确切的重复,但它确实为您提供解决方案。 –