为什么在自动装配扩展MongoRepository的接口时会出现NullPointerException?

时间:2014-08-24 12:54:09

标签: java spring spring-boot spring-data-mongodb

我正在尝试使用 Spring Data 编写一个从 MongoDB 获取数据的访问层类,但是我遇到以下问题: 我有以下界面:

public interface BlogDataRepository extends MongoRepository<Article, String> {
    public Article findArticleByName(String name);
}

和访问层类:

@EnableAutoConfiguration
public class BlogDataAccessLayer {

    @Autowired
    private BlogDataRepository dataRepository;
    ...
}

最后是一个主要课程:

@EnableAutoConfiguration
public class Test implements CommandLineRunner {

    public static void main(String[] args) {
        SpringApplication.run(Test.class, args);
    }

    public void run(String... args) throws Exception {
        BlogDataAccessLayer layer = new BlogDataAccessLayer();

        Article article = new Article("test", "first article");
        layer.addArticle(article);
    }
}

每次我尝试运行该应用时,我都会从位于NullPointerExeption的{​​{1}}获得dataRepository

我不明白为什么BlogDataAccessLayer没有自动装配。如果我在dataRepository中移动dataRepository,那就可以了。

有人可以解释为什么我会这样做吗?

2 个答案:

答案 0 :(得分:5)

我将从上到下审核您的代码,首先要考虑的是在数据访问层中使用@Repository注释,在这种情况下,BlogDataRepository接口应使用此构造型注释进行注释

在域驱动设计意义上,我们应该通过服务层访问存储库层。所以在你的情况下BlogDataAccessLayer充当服务层,在这种情况下@EnableAutoConfiguration是多余的,在Spring echo系统服务层bean中应注释@Service注释。

代码的最后也是最重要的部分,春季启动@EnableAutoConfiguration不会在您的类路径中扫描bean,您应该在您的主要类@ComponentScan中添加@Autowired @Configuration 1}} class。

请注意,在Spring Boot中,将主类放在root包和其特定包中的其他类中是一种很好的做法。例如,这是一个很好的做法:

Test

如果你想在你的客户端类中使用bean,你应该注入它们。因此,在您的情况下,使用org->Application.java //Test org.service->FooService.java // BlogDataAccessLayer org.repository->FooRepository // BlogDataRepository 关键字实例化BlogDataAccessLayer应替换为spring {{3}}注释。并且您的new课程应该有{{3}}注释。

答案 1 :(得分:2)

您需要自动装配BlogDataAccessLayer而不是实例化。然后只有该类中的BlogDataRepository才能自动装配。