Descripción del problema
En el proceso de autenticación unificada y autenticación en la capa de puerta de enlace, es necesario llamar de forma remota a la interfaz del servidor de autenticación para realizar operaciones de autenticación. Sin embargo, durante el proceso de uso de OpenFiegn para realizar llamadas remotas, apareció la siguiente pila de errores, lo que provocó que la llamada remota fallara.
información de la pila
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
Información clave
No qualifying bean of type 'org.springframework.boot.autoconfigure.http.HttpMessageConverters
solución
Análisis de pila: HttpMessageConverters no se inyectó en el contenedor para su administración
1. Código fuente: HttpMessageConverters.java
no se encontró ninguna excepción, así que comencé a verificar si existía AutoConfiguration
.HttpMessageConvertersAutoConfiguration.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. Código fuente: @Conditional(NotReactiveWebApplicationCondition.class)
@Conditional
es Spring4
una anotación recién proporcionada, su función es juzgar según ciertas condiciones, si se cumplen las condiciones, registrar el contenedor bean
y luego ver la clase.NotReactiveWebApplicationCondition
static class NotReactiveWebApplicationCondition extends NoneNestedConditions {
NotReactiveWebApplicationCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
}
@ConditionalOnWebApplication(type = Type.REACTIVE)
private static class ReactiveWebApplication {
}
}
3. Spring Cloud Gateway
Está basado WebFlux
en , ReactiveWeb
por lo que HttpMessageConverters
no se inyectará automáticamente. Entonces copié directamente el código fuente en el archivo de configuración Bean
y finalmente lo logré.
# 新建配置类
@Configuration
public class WebFluxWithOpenFeignConfig {
@Bean
@ConditionalOnMissingBean
public HttpMessageConverters messageConverters(ObjectProvider<HttpMessageConverter<?>> converters) {
return new HttpMessageConverters(converters.orderedStream().collect(Collectors.toList()));
}
}