Problembeschreibung
Im Prozess der einheitlichen Authentifizierung und Authentifizierung auf der Gateway-Ebene muss die Schnittstelle des Authentifizierungsservers remote aufgerufen werden, um Authentifizierungsvorgänge durchzuführen. Während der Verwendung von OpenFiegn zum Tätigen von Remote-Aufrufen trat jedoch der folgende Fehlerstapel auf, der dazu führte, dass der Remote-Aufruf fehlschlug.
Stapelinformationen
feign.codec.EncodeException: No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.resolve(ReflectiveFeign.java:384)
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ⇢ org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
|_ checkpoint ⇢ org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]
|_ checkpoint ⇢ org.sprin
Schlüsselinformation
No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters
Lösung
Stapelanalyse: HttpMessageConverters wurde nicht zur Verwaltung in den Container eingefügt.
1. Quellcode: HttpMessageConverters.java
Es wurde keine Ausnahme gefunden, daher habe ich begonnen zu prüfen, ob sie vorhanden ist AutoConfiguration
. ÖffnenHttpMessageConvertersAutoConfiguration.java
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HttpMessageConverter.class)
@Conditional(NotReactiveWebApplicationCondition.class)
@AutoConfigureAfter({ GsonAutoConfiguration.class, JacksonAutoConfiguration.class, JsonbAutoConfiguration.class })
@Import({ JacksonHttpMessageConvertersConfiguration.class, GsonHttpMessageConvertersConfiguration.class,
JsonbHttpMessageConvertersConfiguration.class })
public class HttpMessageConvertersAutoConfiguration {
}
2. Quellcode: @Conditional(NotReactiveWebApplicationCondition.class)
@Conditional
Es handelt sich um Spring4
eine neu bereitgestellte Annotation. Ihre Funktion besteht darin, anhand bestimmter Bedingungen zu beurteilen. Wenn die Bedingungen erfüllt sind, registrieren Sie den Container bean
und zeigen Sie dann die Klasse an.NotReactiveWebApplicationCondition
static class NotReactiveWebApplicationCondition extends NoneNestedConditions {
NotReactiveWebApplicationCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
}
@ConditionalOnWebApplication(type = Type.REACTIVE)
private static class ReactiveWebApplication {
}
}
3. Spring Cloud Gateway
Es basiert WebFlux
auf und wird ReactiveWeb
daher nicht automatisch injiziert. HttpMessageConverters
Also habe ich den Quellcode direkt in die Konfigurationsdatei kopiert Bean
und es endlich geschafft.
# 新建配置类
@Configuration
public class WebFluxWithOpenFeignConfig {
@Bean
@ConditionalOnMissingBean
public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
}
}