java @Primary和@Profile不能覆盖Bean

chhkpiq4  于 12个月前  发布在  Java
关注(0)|答案(2)|浏览(135)

我有一个Spring项目要运行(又名PA),它与其他项目(PB)有依赖关系,而这个项目与其他项目(PC)有依赖关系PB实际上是PC的定制。
问题是,我的PA使用一个不同的数据库模型比PC最初设计的。在PC中有一个@Bean的@Configuration类被恢复查询数据库

@Configuration
public class CoreConfig {

  @Bean
  public Map<Long, String> translatedActivationStatusMap(ActivationStatusRepository activationStatusRepository,
      TranslationUtil translationUtil) {
    return activationStatusRepository.findActivationStatusBusinessCodes()
        .stream()
        .collect(Collectors.toMap(ActivationStatusRow::getId, activationStatusRow -> {
          final String translatedPrimaryStatus = translationUtil
              .getTranslation(activationStatusRow.getStatusPrimaryBusinessCode(), activationStatusRow.getStatusPrimaryDescription());
          final String translatedSecondaryStatus = translationUtil
              .getTranslation(activationStatusRow.getStatusSecondaryBusinessCode(), activationStatusRow.getStatusSecondaryDescription());
          return String.format("%s - %s", translatedPrimaryStatus, translatedSecondaryStatus);
        }));
  }
}

字符串
由于上层仓库方法查询的表在PA中配置的DB中不存在,因此会抛出异常:
表或视图不存在
我的解决方法是避免Spring尝试在上下文中加载这样的bean。为了做到这一点,我尝试了几个选项,但它们都有效。

选项1:在PB中创建一个新类,并将其注解为@Configuration,并将返回相同类型的方法注解为@Bean和@Primary。但不起作用。引发了相同的异常

@Configuration
public class CoreConfigSecond {

  @Bean
  @Primary
  public Map<Long, String> translatedActivationStatusMapSecond(ActivationStatusRepository activationStatusRepository,
                                                         TranslationUtil translationUtil) {
    return new HashMap<>();
  }
}

选项2:使用@Profile(“test”)注解同一个类,并在应用程序属性中设置属性“spring.profiles.active=test”。

有没有人知道为什么@Primary没有覆盖这个方法?你认为它能解决我的问题吗?
多谢了!

ggazkfy8

ggazkfy81#

我想我有一个想法。Execute @bean方法是在运行时。它执行第一个bean。如果找到另一个带有@Primary的方法,则spring重写该对象。但是带有@Bean的方法总是被执行,即使有另一个带有@Primary的方法返回相同类型的对象。
绝对@主要不会解决我的问题,可能我必须继续与配置文件的战略。

4uqofj5v

4uqofj5v2#

CoreConfigSecond被忽略

您的PB被忽略。请将CoreConfigSecond编码为第一个配置,并从PC im CoreConfigSecond@ImportConfig配置。

相关问题