@ConditionalOnBean (ClientRegistrationService :: class) не соответствует JdbcClientDetailsService - PullRequest
0 голосов
/ 11 июня 2019

Я пишу контроллер 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-компонент, который реализует оба интерфейса и правильно соответствует условным выражениям? Есть ли работа вокруг?

1 Ответ

0 голосов
/ 29 июня 2019

Мне удается обойти это с помощью следующего:

@Bean
@Lazy
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
public ClientRegistrationService registrationDetailsService(ClientDetailsServiceConfigurer configurer)
        throws Exception {
    ClientDetailsService built = configurer.and().build();

    if (built instanceof ClientRegistrationService) {
        return (ClientRegistrationService) built;
    } else {
        throw new IllegalStateException(built + " is not instanceof " + ClientRegistrationService.class);
    }
}

Он применяет тот же шаблон, что и ClientDetailsServiceConfiguration, и полагается на тот же конфигуратор.

Мы можем получить '@Scope (proxyMode = ScopedProxyMode.INTERFACES)', если вы хотите получить действительный JdbcClientDetailsService

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