java @Autowired对象始终为null [重复]

rwqw0loc  于 2024-01-05  发布在  Java
关注(0)|答案(3)|浏览(163)

此问题在此处已有答案

Why is my Spring @Autowired field null?(21个回答)
4年前关闭。
我已经开始使用spring data elasticsearch,并一直在研究here示例。
我无法理解@Autowired的工作原理。请考虑以下内容:

IMessageProcessor.java:

  1. package message.processor;
  2. public interface IMessageProcessor {
  3. void processMessage();
  4. }

字符串

MyMessageProcessor.java

  1. package message.processor;
  2. @Component
  3. public class MyMessageProcessor implements IMessageProcessor {
  4. @Autowired
  5. private ArticleServiceImpl articleService;
  6. private final Author johnSmith = new Author("John Smith");
  7. private final Author johnDoe = new Author("John Doe");
  8. @Override
  9. public void processMessage() {
  10. Article article = new Article("Spring Data Elasticsearch");
  11. article.setAuthors(asList(johnSmith, johnDoe));
  12. article.setTags("elasticsearch", "spring data");
  13. articleService.save(article);
  14. }
  15. }

MyMessageProcessorIT.java

  1. package message.processor;
  2. @RunWith(SpringJUnit4ClassRunner.class)
  3. @ContextConfiguration(classes = Config.class)
  4. public class MyMessageProcessorIT {
  5. @Autowired
  6. private ElasticsearchTemplate elasticsearchTemplate;
  7. @Before
  8. public void before() {
  9. elasticsearchTemplate.deleteIndex(Article.class);
  10. elasticsearchTemplate.createIndex(Article.class);
  11. }
  12. @Test
  13. void testProcessMessage() {
  14. MyMessageProcessor msgProcessor = new MyMessageProcessor();
  15. msgProcessor.processMessage();
  16. }
  17. }


每当我运行单元测试时,MyMessageProcessor中的articleService总是null。我需要额外的配置才能使自动装配工作吗?所有其他代码与上面链接的github repo中的代码相同。
如何确保在项目中需要使用ArticleServiceImpl的任何地方都正确地自动连接?
我看过其他有同样问题的帖子,但没有一个解决方案似乎对我下面的例子有效。

hxzsmxv2

hxzsmxv21#

您没有使用Spring创建的MyMessageProcessor示例,而是在这一行创建了自己的示例。

  1. MyMessageProcessor msgProcessor = new MyMessageProcessor();

字符串
您应该在测试类中自动连接MyMessageProcessor。

w1e3prcc

w1e3prcc2#

@PCL,你的帖子中的第一个评论链接提供了完整的答案,但在你的代码中,你有两个选择:1 -把MyMessageProcessor msgProcessor自动连接:

  1. package message.processor;
  2. @RunWith(SpringJUnit4ClassRunner.class)
  3. @ContextConfiguration(classes = Config.class)
  4. public class MyMessageProcessorIT {
  5. @Autowired
  6. private ElasticsearchTemplate elasticsearchTemplate;
  7. @Autowired
  8. private MyMessageProcessor msgProcessor;
  9. ...
  10. @Test
  11. void testProcessMessage() {
  12. msgProcessor.processMessage();
  13. }
  14. }

字符串
或者,你获取应用程序上下文并手动自动连接bean,在@Tom提供的链接中,你可以看到这样引用的链接有手动bean查找。如果你想创建一个新的bean,那么applicationContext也有一个autowire方法。
最好的问候,大卫

展开查看全部
pbgvytdp

pbgvytdp3#

原因是你不允许spring来管理你的类MyMessageProcessor,所以spring不会注入你的ArticleServiceImpl,请按照这些步骤操作

  • 你的MyMessageProcessor不是spring管理的bean - external class等,所以需要添加到configuration中。然后在你的test class中定义MyMessageProcessor为带有@Autowired的field。

public class String {

  1. @Bean
  2. public MyMessageProcessor processor() {
  3. return new MyMessageProcessor();
  4. }
  5. }

字符串

  • 否则,只需将MyMessageProcessor作为@Autowired字段。

相关问题