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

rwqw0loc  于 5个月前  发布在  Java
关注(0)|答案(3)|浏览(63)

此问题在此处已有答案

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

IMessageProcessor.java:

package message.processor;

public interface IMessageProcessor {
    void processMessage();
}

字符串

MyMessageProcessor.java

package message.processor;

@Component
public class MyMessageProcessor implements IMessageProcessor {

    @Autowired
    private ArticleServiceImpl articleService;

    private final Author johnSmith = new Author("John Smith");
    private final Author johnDoe = new Author("John Doe");

    @Override
    public void processMessage() {
        Article article = new Article("Spring Data Elasticsearch");
        article.setAuthors(asList(johnSmith, johnDoe));
        article.setTags("elasticsearch", "spring data");
        articleService.save(article);       
    }   
}

MyMessageProcessorIT.java

package message.processor;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class MyMessageProcessorIT {

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Before
    public void before() {
        elasticsearchTemplate.deleteIndex(Article.class);
        elasticsearchTemplate.createIndex(Article.class);
    }

    @Test
    void testProcessMessage() {
        MyMessageProcessor msgProcessor = new MyMessageProcessor();
        msgProcessor.processMessage();
    }
}


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

hxzsmxv2

hxzsmxv21#

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

MyMessageProcessor msgProcessor = new MyMessageProcessor();

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

w1e3prcc

w1e3prcc2#

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

package message.processor;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class MyMessageProcessorIT {

    @Autowired
    private ElasticsearchTemplate elasticsearchTemplate;

    @Autowired
    private MyMessageProcessor msgProcessor;
    ...
    @Test
    void testProcessMessage() {
       msgProcessor.processMessage();
    }
}

字符串
或者,你获取应用程序上下文并手动自动连接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 {

@Bean
 public MyMessageProcessor processor() {
  return new MyMessageProcessor();
  }
}

字符串

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

相关问题