From 80911d088c2869fa5c4a11dc9c9d31e983eef606 Mon Sep 17 00:00:00 2001 From: muyun12 <1165933780@qq.com> Date: Fri, 13 Mar 2020 17:01:06 +0800 Subject: [PATCH] fix the error of Struts2 plugin: java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus() (#4503) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 吴晟 Wu Sheng --- .../apm/plugin/struts2/Struts2Interceptor.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/struts2/Struts2Interceptor.java b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/struts2/Struts2Interceptor.java index 18a15993c..4f5fa1aec 100644 --- a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/struts2/Struts2Interceptor.java +++ b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/struts2/Struts2Interceptor.java @@ -26,6 +26,7 @@ import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.util.MethodUtil; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; import org.apache.struts2.ServletActionContext; import org.apache.skywalking.apm.agent.core.context.CarrierItem; @@ -34,6 +35,15 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceM import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; public class Struts2Interceptor implements InstanceMethodsAroundInterceptor { + + private static boolean IS_SERVLET_GET_STATUS_METHOD_EXIST; + private static final String SERVLET_RESPONSE_CLASS = "javax.servlet.http.HttpServletResponse"; + private static final String GET_STATUS_METHOD = "getStatus"; + + static { + IS_SERVLET_GET_STATUS_METHOD_EXIST = MethodUtil.isMethodExist(Struts2Interceptor.class.getClassLoader(), SERVLET_RESPONSE_CLASS, GET_STATUS_METHOD); + } + @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { @@ -59,7 +69,7 @@ public class Struts2Interceptor implements InstanceMethodsAroundInterceptor { HttpServletResponse response = ServletActionContext.getResponse(); AbstractSpan span = ContextManager.activeSpan(); - if (response.getStatus() >= 400) { + if (IS_SERVLET_GET_STATUS_METHOD_EXIST && response.getStatus() >= 400) { span.errorOccurred(); Tags.STATUS_CODE.set(span, Integer.toString(response.getStatus())); }