diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java index d28231aabfa..0e4de59cf7c 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpoint.java @@ -92,6 +92,15 @@ public class EnvironmentMvcEndpoint extends EndpointMvcAdapter } } + @Override + protected Object getOptionalValue(Environment source, String name) { + Object result = source.getProperty(name); + if (result != null) { + result = ((EnvironmentEndpoint) getDelegate()).sanitize(name, result); + } + return result; + } + @Override protected Object getValue(Environment source, String name) { String result = source.getProperty(name); diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpoint.java index a6990162a1c..57dbc434936 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpoint.java @@ -67,13 +67,23 @@ public class MetricsMvcEndpoint extends EndpointMvcAdapter { @Override protected void getNames(Map source, NameCallback callback) { for (String name : source.keySet()) { - callback.addName(name); + try { + callback.addName(name); + } + catch (NoSuchMetricException ex) { + // Metric with null value. Continue. + } } } + @Override + protected Object getOptionalValue(Map source, String name) { + return source.get(name); + } + @Override protected Object getValue(Map source, String name) { - Object value = source.get(name); + Object value = getOptionalValue(source, name); if (value == null) { throw new NoSuchMetricException("No such metric: " + name); } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java index 4db40bba5c5..ad389740950 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilter.java @@ -71,6 +71,8 @@ abstract class NamePatternFilter { protected abstract Object getValue(T source, String name); + protected abstract Object getOptionalValue(T source, String name); + /** * Callback used to add a name. */ @@ -96,7 +98,10 @@ abstract class NamePatternFilter { @Override public void addName(String name) { if (this.pattern.matcher(name).matches()) { - this.results.put(name, getValue(NamePatternFilter.this.source, name)); + Object value = getOptionalValue(NamePatternFilter.this.source, name); + if (value != null) { + this.results.put(name, value); + } } } diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpointTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpointTests.java index 2e01d179128..5612548a488 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpointTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/EnvironmentMvcEndpointTests.java @@ -16,6 +16,9 @@ package org.springframework.boot.actuate.endpoint.mvc; +import java.util.HashMap; +import java.util.Map; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -34,6 +37,8 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; @@ -89,6 +94,10 @@ public class EnvironmentMvcEndpointTests { @Test public void regex() throws Exception { + Map map = new HashMap(); + map.put("food", null); + ((ConfigurableEnvironment) this.context.getEnvironment()).getPropertySources() + .addFirst(new MapPropertySource("null-value", map)); this.mvc.perform(get("/env/foo.*")).andExpect(status().isOk()) .andExpect(content().string(containsString("\"foo\":\"bar\""))) .andExpect(content().string(containsString("\"fool\":\"baz\""))); diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpointTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpointTests.java index ac48dc14a4a..639d88016d0 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpointTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/MetricsMvcEndpointTests.java @@ -126,7 +126,6 @@ public class MetricsMvcEndpointTests { public void specificMetricWithDot() throws Exception { this.mvc.perform(get("/metrics/group2.a")).andExpect(status().isOk()) .andExpect(content().string(containsString("1"))); - } @Import({ JacksonAutoConfiguration.class, @@ -148,6 +147,7 @@ public class MetricsMvcEndpointTests { metrics.add(new Metric("group1.b", 1)); metrics.add(new Metric("group2.a", 1)); metrics.add(new Metric("group2_a", 1)); + metrics.add(new Metric("baz", null)); return Collections.unmodifiableList(metrics); } diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java index 751852f0739..838c190c650 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/mvc/NamePatternFilterTests.java @@ -95,6 +95,11 @@ public class NamePatternFilterTests { private boolean getNamesCalled; + @Override + protected Object getOptionalValue(Object source, String name) { + return name; + } + @Override protected Object getValue(Object source, String name) { return name;