Мое приложение не регистрирует сервис в Консуле. Я отслеживал исходный код, проблема выглядит так, как будто метод привязки AbstractAutoServiceRegistration не вызывает. Если я правильно понимаю, логика привязки находится в org.springframework.cloud.consul.serviceregistry.ConsulAutoServiceRegistrationAutoConfiguration, она определила компонент, тип которого является ConsulAutoServiceRegistration. Класс ConsulAutoServiceRegistration расширен от класса AbstractAutoServiceRegistration.
@Bean
@ConditionalOnMissingBean
public ConsulAutoServiceRegistration consulAutoServiceRegistration(
ConsulServiceRegistry registry,
AutoServiceRegistrationProperties autoServiceRegistrationProperties,
ConsulDiscoveryProperties properties,
ConsulAutoRegistration consulRegistration) {
return new ConsulAutoServiceRegistration(registry,
autoServiceRegistrationProperties, properties, consulRegistration);
}
Затем метод с именем bind в AbstractAutoServiceRegistration аннотируется @EventListener (WebServerInitializedEvent.class).
@EventListener(WebServerInitializedEvent.class)
public void bind(WebServerInitializedEvent event) {
ApplicationContext context = event.getApplicationContext();
if (context instanceof ConfigurableWebServerApplicationContext) {
if ("management".equals(
((ConfigurableWebServerApplicationContext) context).getServerNamespace())) {
return;
}
}
this.port.compareAndSet(0, event.getWebServer().getPort());
this.start();
}
Но я обнаружил, что этот метод не регистрируется в прослушивателях, поскольку пакет AbstractAutoServiceRegistration запускается с "org.springframework". поэтому в EventListenerMethodProcessor это было проигнорировано.
private void processBean(final String beanName, final Class<?> targetType) {
if (!this.nonAnnotatedClasses.contains(targetType) && !isSpringContainerClass(targetType)) {
...
}
private static boolean isSpringContainerClass(Class<?> clazz) {
return (clazz.getName().startsWith("org.springframework.") &&
!AnnotatedElementUtils.isAnnotated(ClassUtils.getUserClass(clazz), Component.class));
}
В чем проблема? И как я могу это исправить?