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

djW*_*ann 1 java spring spring-data-mongodb spring-boot

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

public interface BlogDataRepository extends MongoRepository<Article, String> {
    public Article findArticleByName(String name);
}
Run Code Online (Sandbox Code Playgroud)

和访问层类:

@EnableAutoConfiguration
public class BlogDataAccessLayer {

    @Autowired
    private BlogDataRepository dataRepository;
    ...
}
Run Code Online (Sandbox Code Playgroud)

最后一个主要课程:

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

每次我试图运行应用程序,我收到了NullPointerExeption来自dataRepository位于BlogDataAccessLayer.

我不明白为什么dataRepository不自动装配.如果我搬进dataRepositoryTest就可以了.

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

Ham*_*ani 5

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

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

代码的最后也是最重要的部分,spring boot @EnableAutoConfiguration不会扫描类路径中的bean,你应该@ComponentScan在你的case Test类中添加你的主类.

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

org->Application.java //Test
org.service->FooService.java // BlogDataAccessLayer
org.repository->FooRepository // BlogDataRepository
Run Code Online (Sandbox Code Playgroud)

如果你想在你的客户端类中使用bean,你应该注入它们.所以在你的情况下,BlogDataAccessLayernew关键字实例化应该用spring @Autowired注释替换.而且你的Test班级应该有@Configuration注释.