From 7cff8ddbd3d221628e61438fe3d3032e69f9fd92 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 16 Oct 2017 16:23:51 -0400 Subject: [PATCH] Add missing jackson serialization for instanceinfo. Port information was missing from data sent to eureka. fixes gh-2372 --- .../RestTemplateTransportClientFactory.java | 39 +++++++++++++++++++ .../http/EurekaServerMockApplication.java | 8 ++++ .../RestTemplateEurekaHttpClientTest.java | 1 + 3 files changed, 48 insertions(+) diff --git a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java index 00c8f9d3..9258a311 100644 --- a/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java +++ b/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/http/RestTemplateTransportClientFactory.java @@ -23,10 +23,21 @@ import org.springframework.http.client.support.BasicAuthorizationInterceptor; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; +import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.databind.ser.BeanSerializerModifier; +import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase; +import com.netflix.appinfo.InstanceInfo; +import com.netflix.discovery.converters.jackson.mixin.ApplicationsJsonMixIn; +import com.netflix.discovery.converters.jackson.mixin.InstanceInfoJsonMixIn; +import com.netflix.discovery.converters.jackson.serializer.InstanceInfoJsonBeanSerializer; +import com.netflix.discovery.shared.Applications; import com.netflix.discovery.shared.resolver.EurekaEndpoint; import com.netflix.discovery.shared.transport.EurekaHttpClient; import com.netflix.discovery.shared.transport.TransportClientFactory; @@ -84,13 +95,41 @@ public class RestTemplateTransportClientFactory implements TransportClientFactor converter.setObjectMapper(new ObjectMapper() .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)); + SimpleModule jsonModule = new SimpleModule(); + jsonModule.setSerializerModifier(createJsonSerializerModifier());//keyFormatter, compact)); + converter.getObjectMapper().registerModule(jsonModule); + converter.getObjectMapper().configure(SerializationFeature.WRAP_ROOT_VALUE, true); converter.getObjectMapper().configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); + converter.getObjectMapper().addMixIn(Applications.class, ApplicationsJsonMixIn.class); + converter.getObjectMapper().addMixIn(InstanceInfo.class, InstanceInfoJsonMixIn.class); + + // converter.getObjectMapper().addMixIn(DataCenterInfo.class, DataCenterInfoXmlMixIn.class); + // converter.getObjectMapper().addMixIn(InstanceInfo.PortWrapper.class, PortWrapperXmlMixIn.class); + // converter.getObjectMapper().addMixIn(Application.class, ApplicationXmlMixIn.class); + // converter.getObjectMapper().addMixIn(Applications.class, ApplicationsXmlMixIn.class); + return converter; } + public static BeanSerializerModifier createJsonSerializerModifier() {//final KeyFormatter keyFormatter, final boolean compactMode) { + return new BeanSerializerModifier() { + @Override + public JsonSerializer modifySerializer(SerializationConfig config, + BeanDescription beanDesc, JsonSerializer serializer) { + /*if (beanDesc.getBeanClass().isAssignableFrom(Applications.class)) { + return new ApplicationsJsonBeanSerializer((BeanSerializerBase) serializer, keyFormatter); + }*/ + if (beanDesc.getBeanClass().isAssignableFrom(InstanceInfo.class)) { + return new InstanceInfoJsonBeanSerializer((BeanSerializerBase) serializer, false); + } + return serializer; + } + }; + } + @Override public void shutdown() { } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java index 50ee6263..63976782 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/EurekaServerMockApplication.java @@ -35,6 +35,10 @@ import com.netflix.appinfo.InstanceInfo; import com.netflix.discovery.shared.Application; import com.netflix.discovery.shared.Applications; +import static com.netflix.appinfo.InstanceInfo.DEFAULT_PORT; +import static com.netflix.appinfo.InstanceInfo.DEFAULT_SECURE_PORT; +import static org.springframework.util.Assert.isTrue; + /** * Mocked Eureka Server * @@ -62,6 +66,10 @@ public class EurekaServerMockApplication { @PostMapping("/apps/{appName}") public void register(@PathVariable String appName, @RequestBody InstanceInfo instanceInfo) { + isTrue(instanceInfo.getPort() != DEFAULT_PORT && instanceInfo.getPort() != 0, + "Port not received from client"); + isTrue(instanceInfo.getSecurePort() != DEFAULT_SECURE_PORT && instanceInfo.getSecurePort() != 0, + "Secure Port not received from client"); // Nothing to do } diff --git a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestTemplateEurekaHttpClientTest.java b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestTemplateEurekaHttpClientTest.java index e02f50f3..4545d62c 100644 --- a/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestTemplateEurekaHttpClientTest.java +++ b/spring-cloud-netflix-eureka-client/src/test/java/org/springframework/cloud/netflix/eureka/http/RestTemplateEurekaHttpClientTest.java @@ -67,6 +67,7 @@ public class RestTemplateEurekaHttpClientTest { config.setVirtualHostName(appname); config.setSecureVirtualHostName(appname); config.setNonSecurePort(4444); + config.setSecurePort(8443); config.setInstanceId("127.0.0.1:customapp:4444"); info = new EurekaConfigBasedInstanceInfoProvider(config).get();