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)有很多很好的答案,但每个都有自己的,不同的上下文,并没有帮助我。

+0

可能重复的[为什么我的Spring @Autowired字段为空?](http://*.com/questions/19896870/why-is-my-spring-autowired-field-null) –

+0

@SotiriosDelimanolis这就是我也一直在想,直到我读到它(这就是为什么我把它和我的问题联系起来)。 – Patrick

+0

对。这不是一个确切的重复,但它确实为您提供解决方案。 –

春天不autowire static字段。这就是为什么userRepo字段是null。一种方法是将UserFacade作为一个bean本身,然后可以使userRepo成为一个非静态字段。我更喜欢这种方式。 UserFacade不应该是一个实用类,因为它正在与存储库bean进行交互。把它变成豆子会更有意义。

另一种选择是提供了一个二传手,并使用对@Autowired

@Autowired 
public void setUserRepo(UserRepository userRepo) { 
    UserFacade.userRepo = userRepo; 
} 

或将其即使在参数的构造函数会工作。

+0

谢谢,我不知道。有没有办法让它保持静态(作为'@ Autowired'的替代品)? – Patrick

+0

@帕特里克我想我给你两个。 'setter'和'constructor'。但是,你真的应该改变它为豆。 –

+0

Ups你是对的..我很困惑,我以为我不能从非静态方法设置静态变量变量(虽然这是相反的方式)。我怎么会打电话给二传手?你仍然推荐使用一个bean,为什么呢?我认为在这种情况下它没有意义,它更像是一个帮手类。 – Patrick