Реализация сервиса - как выбрать, какая реализация сервиса будет использоваться на основе атрибута application.properties? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть две реализации сервиса:

Интерфейс сервиса:

/** 
* Service used for resolving external ID for the entity.
*/
public interface ResolveService {
   String valueToResolve(String id);
}

Реализация сервиса - A:

@Service
public class ResolveServiceAImpl implements {

  @Override
  public String valueToResolve(String id) {
    // grpc impl...
  }

}

Реализация Служба - B:

@Service
public class ResolveServiceBImpl implements {

  @Override
  public String valueToResolve(String id) {
    // jpa impl...
  }

}

На данный момент это разрешено с помощью @Qualifier, и эта реализация работает:

   @Qualifier("resolveServiceBImpl")
   @Autowired
   private ResolveService resolveService;

Проблема для меня заключается в том, что я не хочу определять в каждом классе строковое значение @Qualifier. Я хотел бы определить значение @Qualifier в одном месте, скажем, в файле application.properties.

application.properties:

resolve.service.active=resolveServiceBImpl

Эта реализация не работает :

   @Value("'${resolve.service.active}')")
   private String resolveServiceActive;

   @Qualifier(resolveServiceActive)
   @Autowired
   private ResolveService resolveService;

Я получаю ошибку: Attribute value must be constant. Cannot find bean with qualifier null.

Есть ли другой способ разрешения значения @Qualifier, так что мне нужно присваивать его вручную в каждом классе отдельно?

1 Ответ

0 голосов
/ 01 апреля 2020

@ jonrsharpe tnx за ответ.

Я решил его с помощью @Profile.

РЕШЕНИЕ:

Реализация службы A:

@Service
@Profile("A")
public class ResolveServiceAImpl implements ResolveService {...

Реализация службы B:

@Service
@Profile("B")
public class ResolveServiceBImpl implements ResolveService {...

и application.properties:

spring.profiles.active=A

А для теста я использовал @ActiveProfiles("A").

Это решило мою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...