一尘不染

Spring MVC-静态上下文中自动连接的存储库NullPointerException

spring-mvc

在我的模型中,我有一个名为的存储库UserRepository。此外,我还有一个UserFacade基本上将用户添加到存储库中并由Controller访问的功能。该仓库@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。我错过了什么?

注意:对相关问题有很多很棒的答案问题,但是每个问题都有自己的不同背景,并且对我没有帮助。


阅读 313

收藏
2020-06-01

共1个答案

一尘不染

Spring不会自动连接static字段。这就是为什么userReponull。一种方法是使UserFacadebean本身,然后可以使userRepo非静态字段。我希望这样。UserFacade实际上,它不应该是实用程序类,因为它正在与存储库bean交互。使其成为一个豆将更有意义。

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

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

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

2020-06-01