【问题标题】:Spring @Inject not workingSpring @Inject 不起作用
【发布时间】:2017-08-04 09:58:37
【问题描述】:

我最近将一个项目从 Spring 4.3.1 升级到 4.3.4,以前可以正常工作,现在对我不起作用。

我使用 JPA,它包含一系列存储库类:

 /**
 * Spring Data JPA repository for the DrugQualityCategory entity.
 */

public interface DrugQualityCategoryRepository extends JpaRepository<DrugQualityCategory,Long> {

    @Query(value = "Select a from DrugQualityCategory a where a.oldId = ?1")
    DrugQualityCategory findOneByOldId(Integer oldId);

}

我们还使用 ElasticSearch 作为搜索引擎,它会创建一系列这样的 SearchRepositories:

  /**
 * Spring Data ElasticSearch repository for the Publication entity.
 */
public interface DrugQualityCategorySearchRepository extends ElasticsearchRepository<Publication, Long> {
}

ES 的一个问题是它需要定期更新其索引,因此我们构建了一个测试,它注入所有存储库并从 JPA 存储库重建它们,当我们注入存储库时看起来像这样:

 @RunWith(SpringJUnit4ClassRunner.class)
  @WebAppConfiguration
  @Transactional
  @ActiveProfiles("syncElasticsearch")
    public class SyncMysqlElasticSearch {

    private Logger logger = LoggerFactory.getLogger(getClass());

    @Inject DrugQualityCategoryRepository drugQualityCategoryRepository;
    @Inject TechniqueRepository techniqueRepository;
    @Inject TradeDrugRepository tradeDrugRepository;
    @Inject SurveyDataRepository surveyDataRepository;
    @Inject RQAAQualityRepository rqaaQualityRepository;

然后我们填充 ES 实例:

drugQualityCategorySearchRepository.save(drugQualityCategoryRepository.findAll());
formulationSearchRepository.save(formulationRepository.findAll());
innDrugSearchRepository.save(innDrugRepository.findAll());
locationSearchRepository.save(locationRepository.findAll());
manufacturerSearchRepository.save(manufacturerRepository.findAll());

现在,我遇到的问题是,当我尝试开始测试时,我不断收到:

 org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name [class name] Unsatisfied dependency expressed
through field [field name] nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type [class name] available: expected at least
1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.inject.Inject()}

我在这里检查了几个问题,例如 this this,快速浏览了 Spring 文档,但找不到任何相关内容

我显然已经在不同的地方尝试了所有@Autowired@Component@Repository 标签,但没有得到肯定的结果

【问题讨论】:

  • 如何设置测试环境?
  • 嗨,Jan,我不确定我知道你在这里所说的上下文是什么意思,我有一个配置 yml 文件,用于设置 ES 和 JPA 的连接参数,除此之外,我只有代码中的注释提取原始问题中的注释

标签: java spring spring-data-jpa spring-data-elasticsearch


【解决方案1】:

您需要使用@ContextConfiguration 注释来注释您的测试类,该注释指向相关的@Configuration 类,该类会扫描并注册您尝试注入的所有这些bean。

查看 @WebAppConfiguration 的 java 文档:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/web/WebAppConfiguration.html

请注意,@WebAppConfiguration 必须与 @ContextConfiguration 一起使用,无论是在单个测试类中还是在测试类层次结构中。

【讨论】:

  • 您好,感谢您的回复,我在过去的一个小时里一直在尝试这个,但仍然无法正常工作。我试过只为上下文添加注释,它不会将我的主类作为参数,它说它不存在,它也不会将 classpath*: 作为参数。我已经尝试将配置标签添加到主类,但运气不好,还与存储库标签等进行了大多数组合......我错过了什么吗?
  • @Steven 你使用 xml 或 Java conig 或 spring boot?
  • Java config with Spring boot,我想我可能正在做一些事情,我只是用 ContextConfiguration(classes = DrugQualityDataManagerApp.class) 进行了注释,现在它给了我我认为不相关的错误跨度>
  • @Steven 好酷。您可以尝试使用“SpringBootTest”注释而不是“ContextConfiguration”。然后(通常),Spring Boot 可以神奇地连接相关配置。你的新错误是什么?
  • 太棒了,谢谢你,现在我得到了其他没有绑定的属性,错误开始于通过方法'setConfigurers'参数0表示的不满足的依赖关系;嵌套异常是 org.springframework.beans.factory.UnsatisfiedDependencyException 并且永远持续下去,但我认为并希望我有这个
猜你喜欢
  • 2014-02-11
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 2015-10-11
  • 2013-05-15
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多