Я пишу контроллер REST, который предоставляет операции CRUD на основе типа обнаруженных компонентов служб OAuth2, что-то вроде этого:
@Bean
@ConditionalOnBean(ClientDetailsService::class)
fun clientServiceController(
clientDetailsService: ClientDetailsService
): ClientDetailsServiceController {
return ClientDetailsServiceController(clientDetailsService)
}
@Bean
@ConditionalOnBean(ClientRegistrationService::class)
fun clientRegistrationServiceController(
clientRegistrationService: ClientRegistrationService
): ClientRegistrationServiceController {
return ClientRegistrationServiceController(clientRegistrationService)
}
Я хочу зарегистрировать контроллер, который выставляет ClientDetailsService
, если у нас нет ClientRegistrationService
. Если он существует, необходимо дополнительно зарегистрировать контроллер для методов в этом интерфейсе.
Один из наших модулей, который регистрирует эти контроллеры, также регистрирует компонент JdbcClientDetailsService
, который реализует оба интерфейса. Тем не менее, @ConditionalOnBean(ClientRegistrationService::class)
не соответствует ему, поэтому только первый компонент создается не вторым.
Это пример того, как мы объявляем JdbcClientDetailsService
:
@Bean
fun jdbcClientDetailsService(
passwordEncoder: PasswordEncoder,
dataSource: DataSource): JdbcClientDetailsService {
return JdbcClientDetailsService(dataSource).apply { setPasswordEncoder(passwordEncoder) }
}
Странно то, что @Autowired ClientRegistrationService
успешно вводит JdbcClientDetailsService
.
Чего мне не хватает? Как я могу объявить bean-компонент, который реализует оба интерфейса и правильно соответствует условным выражениям? Есть ли работа вокруг?