为了账号安全,请及时绑定邮箱和手机立即绑定

@Autowired 对象始终为空

@Autowired 对象始终为空

ibeautiful 2022-07-20 19:23:15
我已经开始使用 spring data elasticsearch 并且一直在查看这里的示例。我无法理解如何@Autowired工作。考虑以下:IMessageProcessor.java:package message.processor;public interface IMessageProcessor {    void processMessage();}MyMessageProcessor.javapackage message.processor;@Componentpublic 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.javapackage 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都正确地自动连接?我似乎有过同样问题的其他帖子,但似乎没有一个解决方案适用于我下面的示例。
查看完整描述

3 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

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

MyMessageProcessor msgProcessor = new MyMessageProcessor();

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


查看完整回答
反对 回复 2022-07-20
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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


@Configuration

public class Configuration { 


@Bean

public MyMessageProcessor mymessageProcessor() {

 return new MyMessageProcessor();

}

}

然后 @Autowire MyMessageProcessor 在您的测试类中


查看完整回答
反对 回复 2022-07-20
?
慕斯王

TA贡献1864条经验 获得超2个赞

您帖子中的第一个评论链接提供了完整的答案,但在您的代码中,您有 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 方法。


最好的问候,大卫


查看完整回答
反对 回复 2022-07-20
  • 3 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信