djW*_*ann 1 java spring spring-data-mongodb spring-boot
我正在尝试编写一个使用Spring Data从MongoDB获取数据的访问层类,但我有以下问题:我有以下界面:
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不自动装配.如果我搬进dataRepository来Test就可以了.
有人可以解释为什么我会这样做吗?
我将从上到下检查您的代码,首先要考虑的是@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,你应该注入它们.所以在你的情况下,BlogDataAccessLayer用new关键字实例化应该用spring @Autowired注释替换.而且你的Test班级应该有@Configuration注释.
| 归档时间: |
|
| 查看次数: |
1953 次 |
| 最近记录: |