@Autowired 对象始终为空

我已经开始使用 spring data elasticsearch 并且一直在查看这里的示例。


我无法理解如何@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();

    }

}

每当我运行单元测试时,articleServiceinMyMessageProcessor总是null. 我需要额外的配置才能使自动装配工作吗?所有其他代码与上面链接的 github 存储库中的相同。


如何确保在我需要使用的项目中的任何地方ArticleServiceImpl都正确地自动连接?


我似乎有过同样问题的其他帖子,但似乎没有一个解决方案适用于我下面的示例。


ibeautiful
浏览 183回答 3
3回答

阿晨1998

您没有使用 Spring 创建的 MyMessageProcessor 实例并在此行上创建自己的实例。MyMessageProcessor msgProcessor = new MyMessageProcessor();您应该改为在测试类中自动装配 MyMessageProcessor。

婷婷同学_

因为您不允许使用 spring 框架创建 MyMessageProcessor,因为 spring 不会注入您的 ArticleServiceImpl@Configurationpublic class Configuration { @Beanpublic MyMessageProcessor mymessageProcessor() { return new MyMessageProcessor();}}然后 @Autowire MyMessageProcessor 在您的测试类中

慕斯王

您帖子中的第一个评论链接提供了完整的答案,但在您的代码中,您有 2 个选择: 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 方法。最好的问候,大卫
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java