Я объявил OAuthClientConfiguration
настройку для WebClient
, используя ReactiveClientRegistrationRepository
. Но когда я пытаюсь автоматически подключить bean-компонент WebClient
, он не получает настройки конфигурации OAuthClientConfiguration
и возвращает нулевой объект.
OAuthClientConfiguration
определяет следующим образом:
@Configuration
class OAuthClientConfiguration {
@Bean
fun clientRegistrations(
@Value("\${spring.security.oauth2.client.provider.okta.access-token-url}") access_token: String?,
@Value("\${spring.security.oauth2.client.registration.okta.client-id}") client_id: String?,
@Value("\${spring.security.oauth2.client.registration.okta.client-secret}") client_secret: String?,
@Value("\${spring.security.oauth2.client.registration.okta.scope}") scope: String?,
@Value("\${spring.security.oauth2.client.registration.okta.authorization-grant-type}") authorizationGrantType: String?
): ReactiveClientRegistrationRepository? {
val registration = ClientRegistration
.withRegistrationId("okta")
.tokenUri(access_token)
.clientId(client_id)
.clientSecret(client_secret)
.scope(scope)
.authorizationGrantType(AuthorizationGrantType(authorizationGrantType))
.build()
return InMemoryReactiveClientRegistrationRepository(registration)
}
@Bean
fun webClient(clientRegistrations: ReactiveClientRegistrationRepository?): WebClient? {
val clientService = InMemoryReactiveOAuth2AuthorizedClientService(clientRegistrations)
val authorizedClientManager =
AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(clientRegistrations, clientService)
val oauth = ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager)
oauth.setDefaultClientRegistrationId("okta")
return WebClient.builder()
.filter(oauth)
.build()
}
}
А WebClient
призвание определяется следующим образом:
@Autowired
private var webClient: WebClient? = null
fun getAccessToken(): String? {
return webClient?.post()
?.retrieve()
?.bodyToFlux(String::class.java)
?.onErrorMap { e: Throwable? -> Exception("message", e) }
?.blockLast();
}
Как создать WebClient
с конфигурацией, определенной в классе OAuthClientConfiguration
?
Я хочу, чтобы он был подключен так, чтобы конфигурация, определенная в OAuthClientConfiguration
, могла быть настроена при ее инициализации.
Я считаю, что клиент создан правильно. Тем не менее, проводка кажется неправильной.
Как правило, лучше использовать проводку на конструкторе.
@Service
class MyService(
val webClient: WebClient
)
Альтернативно, в Котлине я обычно использую:
@Autowired
lateinit var webClient: WebClient
Я предполагаю, что вы находитесь в классе, аннотированном как компонент, и в подпакете основного класса. Правильный? Но, опять же, вместо этого вы должны использовать его в конструкторе.
Да, я аннотировал его как компонент и в подпакете основного класса. Я не могу использовать его в конструкторе, потому что я вызываю его из другого класса.
Что вы имеете в виду, что вызываете его из другого класса? Вы создаете класс с new
?
Когда я автоматически подключаюсь с помощью lateinit, выдает ошибку: свойство lateinit webClient не было инициализировано