diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/CloudJacksonJson.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/CloudJacksonJson.java index a4326d55..eeb30fa8 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/CloudJacksonJson.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/CloudJacksonJson.java @@ -11,7 +11,9 @@ import org.springframework.util.StringUtils; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.Version; +import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; import com.fasterxml.jackson.databind.ObjectWriter; @@ -36,9 +38,13 @@ public class CloudJacksonJson extends LegacyJacksonJson { protected final CloudJacksonCodec codec = new CloudJacksonCodec(); + public CloudJacksonCodec getCodec() { + return codec; + } + @Override public String codecName() { - return getCodecName(this.getClass()); + return getCodecName(LegacyJacksonJson.class); } @Override @@ -120,25 +126,26 @@ public class CloudJacksonJson extends LegacyJacksonJson { static class CloudInstanceInfoSerializer extends InstanceInfoSerializer { @Override - public void serialize(InstanceInfo info, JsonGenerator jgen, + public void serialize(final InstanceInfo info, JsonGenerator jgen, SerializerProvider provider) throws IOException { - if (info.getInstanceId() == null && info.getMetadata() != null) { - String instanceId = calculateInstanceId(info); - info = new InstanceInfo.Builder(info).setInstanceId(instanceId).build(); - } - - super.serialize(info, jgen, provider); + InstanceInfo updated = updateIfNeeded(info); + super.serialize(updated, jgen, provider); } + } - private String calculateInstanceId(InstanceInfo info) { + static InstanceInfo updateIfNeeded(final InstanceInfo info) { + if (info.getInstanceId() == null && info.getMetadata() != null) { String instanceId = info.getMetadata().get("instanceId"); - String hostName = info.getHostName(); - if (instanceId != null && StringUtils.hasText(hostName) && !instanceId.startsWith(hostName)) { - instanceId = hostName + ":" + instanceId; + if (StringUtils.hasText(instanceId)) { + // backwards compatibility for Angel + if (StringUtils.hasText(info.getHostName()) && !instanceId.startsWith(info.getHostName())) { + instanceId = info.getHostName()+":"+instanceId; + } + return new InstanceInfo.Builder(info).setInstanceId(instanceId).build(); } - return instanceId == null ? hostName : instanceId; } + return info; } static class CloudInstanceInfoDeserializer extends InstanceInfoDeserializer { @@ -146,5 +153,12 @@ public class CloudJacksonJson extends LegacyJacksonJson { protected CloudInstanceInfoDeserializer(ObjectMapper mapper) { super(mapper); } + + @Override + public InstanceInfo deserialize(JsonParser jp, DeserializationContext context) throws IOException { + InstanceInfo info = super.deserialize(jp, context); + InstanceInfo updated = updateIfNeeded(info); + return updated; + } } } diff --git a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java index 1c4cf750..0e2f81ed 100644 --- a/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java +++ b/spring-cloud-netflix-eureka-server/src/main/java/org/springframework/cloud/netflix/eureka/server/EurekaServerConfiguration.java @@ -52,6 +52,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter import com.netflix.appinfo.ApplicationInfoManager; import com.netflix.discovery.EurekaClient; import com.netflix.discovery.EurekaClientConfig; +import com.netflix.discovery.converters.EurekaJacksonCodec; import com.netflix.discovery.converters.wrappers.CodecWrapper; import com.netflix.discovery.converters.wrappers.CodecWrappers; import com.netflix.eureka.DefaultEurekaServerContext; @@ -102,6 +103,7 @@ public class EurekaServerConfiguration extends WebMvcConfigurerAdapter { @Value("${eureka.server.defaultOpenForTrafficCount:1}") private int defaultOpenForTrafficCount; + public static final CloudJacksonJson JACKSON_JSON = new CloudJacksonJson(); @Bean public HasFeatures eurekaServerFeature() { @@ -128,15 +130,19 @@ public class EurekaServerConfiguration extends WebMvcConfigurerAdapter { return new EurekaController(this.applicationInfoManager); } + static { + CodecWrappers.registerWrapper(JACKSON_JSON); + EurekaJacksonCodec.setInstance(JACKSON_JSON.getCodec()); + } + @Bean public ServerCodecs serverCodecs() { - CodecWrappers.registerWrapper(new CloudJacksonJson()); return new CloudServerCodecs(this.eurekaServerConfig); } private static CodecWrapper getFullJson(EurekaServerConfig serverConfig) { CodecWrapper codec = CodecWrappers.getCodec(serverConfig.getJsonCodecName()); - return codec == null ? CodecWrappers.getCodec(CloudJacksonJson.class) : codec; + return codec == null ? CodecWrappers.getCodec(JACKSON_JSON.codecName()) : codec; } private static CodecWrapper getFullXml(EurekaServerConfig serverConfig) {