diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java index 4e22e0d652df15a861568870ee7008623587e6b6..a9e429be243e4546812c6d7df6c97c33919fae7c 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/ControllerConstructorInterceptorTest.java @@ -54,7 +54,7 @@ public class ControllerConstructorInterceptorTest { Method m = obj.getClass().getMethods()[0]; cache.addPathMapping(m, "#toString"); - Assert.assertEquals("the two value should be equal", cache.findPathMapping(m), "/test1#toString"); + Assert.assertEquals("the two value should be equal", cache.findPathMapping(m), "/test1/#toString"); } @Test @@ -67,7 +67,7 @@ public class ControllerConstructorInterceptorTest { Method m = obj.getClass().getMethods()[0]; cache.addPathMapping(m, "#toString"); - Assert.assertEquals("the two value should be equal", cache.findPathMapping(m), "#toString"); + Assert.assertEquals("the two value should be equal", cache.findPathMapping(m), "/#toString"); } @Test @@ -80,7 +80,7 @@ public class ControllerConstructorInterceptorTest { Method m = obj.getClass().getMethods()[0]; cache.addPathMapping(m, "#toString"); - Assert.assertEquals("the two value should be equal", cache.findPathMapping(m), "/test3#toString"); + Assert.assertEquals("the two value should be equal", cache.findPathMapping(m), "/test3/#toString"); } @RequestMapping(value = "/test1") diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java index c98693d4376e6c2fb55d5be2b6de6f11eed560b8..776d4585fb88e851024fda3ad2fd1b99b6699740 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/src/test/java/org/apache/skywalking/apm/plugin/spring/mvc/v4/PathMappingCacheTest.java @@ -45,7 +45,31 @@ public class PathMappingCacheTest { Method m = obj.getClass().getMethods()[0]; pathMappingCache.addPathMapping(m, "#toString"); - Assert.assertEquals("the two value should be equal", pathMappingCache.findPathMapping(m), "org.apache.skywalking.apm.plugin.spring.mvc#toString"); + Assert.assertEquals("the two value should be equal", pathMappingCache.findPathMapping(m), "/org.apache.skywalking.apm.plugin.spring.mvc/#toString"); } + + @Test + public void testAutoAddPathSeparator() { + String rightPath = "/root/sub"; + + Object obj = new Object(); + Method m = obj.getClass().getMethods()[0]; + + PathMappingCache cache = new PathMappingCache("root"); + cache.addPathMapping(m, "sub"); + Assert.assertEquals(cache.findPathMapping(m), rightPath); + + PathMappingCache cache2 = new PathMappingCache("/root"); + cache2.addPathMapping(m, "/sub"); + Assert.assertEquals(cache2.findPathMapping(m), rightPath); + + PathMappingCache cache3 = new PathMappingCache("root"); + cache3.addPathMapping(m, "/sub"); + Assert.assertEquals(cache3.findPathMapping(m), rightPath); + + PathMappingCache cache4 = new PathMappingCache("/root"); + cache4.addPathMapping(m, "sub"); + Assert.assertEquals(cache4.findPathMapping(m), rightPath); + } } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/PathMappingCache.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/PathMappingCache.java index a89c131c213741d74ebc802be1e32c25972ec349..494b8005303266100b0afc929d0908e36b6b8856 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/PathMappingCache.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/src/main/java/org/apache/skywalking/apm/plugin/spring/mvc/commons/PathMappingCache.java @@ -19,6 +19,8 @@ package org.apache.skywalking.apm.plugin.spring.mvc.commons; +import org.apache.skywalking.apm.util.StringUtil; + import java.lang.reflect.Method; import java.util.concurrent.ConcurrentHashMap; @@ -28,11 +30,17 @@ import java.util.concurrent.ConcurrentHashMap; * @author zhangxin */ public class PathMappingCache { + + private static final String PATH_SEPARATOR = "/"; + private String classPath = ""; private ConcurrentHashMap methodPathMapping = new ConcurrentHashMap(); public PathMappingCache(String classPath) { + if (!StringUtil.isEmpty(classPath) && !classPath.startsWith(PATH_SEPARATOR)) { + classPath = PATH_SEPARATOR + classPath; + } this.classPath = classPath; } @@ -41,6 +49,10 @@ public class PathMappingCache { } public void addPathMapping(Method method, String methodPath) { + if (!StringUtil.isEmpty(methodPath) && !methodPath.startsWith(PATH_SEPARATOR) + && !classPath.endsWith(PATH_SEPARATOR)) { + methodPath = PATH_SEPARATOR + methodPath; + } methodPathMapping.put(method, classPath + methodPath); } }