我正在尝试使用 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
,那就可以了。
有人可以解释为什么我会这样做吗?
答案 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
才能自动装配。