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

问题描述 投票:-3回答:3

这个问题在这里已有答案:

我已经开始玩spring数据弹性搜索,并一直在查看示例here

我无法理解@Autowired的工作原理。考虑以下:

iMessage processor.Java:

package message.processor;

public interface IMessageProcessor {
    void processMessage();
}

my message processor.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);       
    }   
}

my message processor IT.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();
    }
}

每当我进行单元测试时,articleService中的MyMessageProcessor总是null。我是否需要额外的配置才能使自动装配工作?所有其他代码与上面链接的github repo中的代码相同。

我如何确保在我的项目中我需要使用ArticleServiceImpl,它是否正确自动装配?

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

java spring spring-boot autowired spring-data-elasticsearch
3个回答
1
投票

您没有使用Spring创建的MyMessageProcessor实例并在此行上创建自己的实例。

MyMessageProcessor msgProcessor = new MyMessageProcessor();

您应该在测试类中自动装配MyMessageProcessor。


0
投票

因为你不允许用spring框架创建MyMessageProcessor,因为spring不会注入你的ArticleServiceImpl

@Configuration
public class Configuration { 

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

然后在测试类中@Autowire MyMessageProcessor


0
投票

@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方法。

最好的问候,大卫

© www.soinside.com 2019 - 2024. All rights reserved.