java - Spring MVC - 静态上下文中的 Autowiring 存储库 NullPointerException

标签 java spring spring-mvc autowired

在我的模型中,我有一个名为 UserRepository 的存储库.另外我有一个 UserFacade基本上将用户添加到存储库并由 Controller 访问。 repo 是 @Autowired在门面。当我想添加一个新用户时,我得到了存储库的 nullPointerException。

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

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

而 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
    }
}

来 self 的 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),但每个都有自己的、不同的上下文,对我没有帮助。

最佳答案

Spring 不会 Autowiring static 字段。这就是为什么 userRepo 字段为 null 的原因。一种方法是使 UserFacade 本身成为一个 bean,然后您可以使 userRepo 成为一个非静态字段。我更喜欢这种方式。 UserFacade 实际上不应该是实用程序类,因为它与存储库 bean 交互。将它变成一个 bean 会更有意义。

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

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

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

关于java - Spring MVC - 静态上下文中的 Autowiring 存储库 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22764164/

相关文章:

java - .gitignore 文件在 git 推送期间不会忽略某些文件?

java - Spring请求url Action 类映射

java - 如何配置 mvc :annotation-driven 使用的 Jaxb2Marshaller

java - 如何将 Spring Boot @RepositoryRestResource 映射到特定的 url?

spring - 如何在 Springs MVC 4 中使用 HikariCP 和 JdbcTemplate

java 按成绩、名称对成绩进行排序

java - int[] 是一个对象吗?

java - com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException : Column cannot be null/one-to-one mapping

javascript - 使用 spring 映射 url 填充下拉列表

java - 如何在没有 xml 的 Spring 中运行方面?