From 29eea6d9b6ec739e14bd6b85f15f4ed0998d0862 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 9 Dec 2014 15:11:27 +0000 Subject: [PATCH] Call postInit() aggressively on InstanceRegistry To avoid possible NPE when the registry is used before it is initialized. Fixes gh-97 --- .../server/EurekaServerInitializerConfiguration.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java index 6063f24f..c5b661e7 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerInitializerConfiguration.java @@ -17,6 +17,7 @@ package org.springframework.cloud.netflix.eureka.server; import java.io.IOException; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.lang.reflect.Modifier; import javax.servlet.ServletContext; @@ -56,6 +57,7 @@ import com.netflix.discovery.converters.XmlXStream; import com.netflix.eureka.EurekaBootStrap; import com.netflix.eureka.EurekaServerConfig; import com.netflix.eureka.EurekaServerConfigurationManager; +import com.netflix.eureka.InstanceRegistry; import com.netflix.eureka.PeerAwareInstanceRegistry; /** @@ -189,11 +191,18 @@ public class EurekaServerInitializerConfiguration implements ServletContextAware public void onApplicationEvent(EurekaRegistryAvailableEvent event) { if (instance == null) { instance = PeerAwareInstanceRegistry.getInstance(); + safeInit(); replaceInstance(getProxyForInstance()); expectRegistrations(1); } } + private void safeInit() { + Method method = ReflectionUtils.findMethod(InstanceRegistry.class, "postInit"); + ReflectionUtils.makeAccessible(method); + ReflectionUtils.invokeMethod(method, instance); + } + private void replaceInstance(Object proxy) { Field field = ReflectionUtils.findField(PeerAwareInstanceRegistry.class, "instance");