iterator = load.iterator();
+ while (iterator.hasNext()) {
+ cacheList.add(iterator.next());
+ }
+ }
+ }
+
+
+ public static HttpMessageConverter
getSupportedConverter(P p, R r, ServletAdapter adapter) {
+ synchronized (HttpMessageConvertFactory.class) {
+ if (CollectionUtil.isNotEmpty(cacheList)) {
+ for (HttpMessageConverter converter : cacheList) {
+ if (converter.match(p, r, adapter)) {
+ return converter;
+ }
+ }
+ }
+ return DefaultHttpMessageConverter.getInstance();
+ }
+ }
+
+
+}
diff --git a/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/HttpMessageConverter.java b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/HttpMessageConverter.java
new file mode 100644
index 000000000..52f2f94ea
--- /dev/null
+++ b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/HttpMessageConverter.java
@@ -0,0 +1,10 @@
+package io.arex.inst.httpservlet.convert;
+
+import io.arex.inst.httpservlet.adapter.ServletAdapter;
+
+public interface HttpMessageConverter {
+
+ boolean match(HttpServletRequest request,HttpServletResponse response, ServletAdapter adapter);
+ byte[] getRequest(HttpServletRequest request, ServletAdapter adapter);
+ byte[] getResponse(HttpServletResponse request, ServletAdapter adapter);
+}
diff --git a/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/ApplicationJsonBodyConverter.java b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/ApplicationJsonBodyConverter.java
new file mode 100644
index 000000000..4e5d760b8
--- /dev/null
+++ b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/ApplicationJsonBodyConverter.java
@@ -0,0 +1,36 @@
+package io.arex.inst.httpservlet.convert.impl;
+
+import io.arex.agent.bootstrap.util.StringUtil;
+import io.arex.inst.httpservlet.adapter.ServletAdapter;
+import io.arex.inst.httpservlet.convert.HttpMessageConverter;
+
+public class ApplicationJsonBodyConverter implements HttpMessageConverter {
+
+ private static final String CONTENT_TYPE = "application/json";
+
+ @Override
+ public boolean match(HttpServletRequest request, HttpServletResponse response, ServletAdapter adapter) {
+ if (request == null || response ==null || adapter == null) {
+ return false;
+ }
+ String contentType = adapter.getContentType(request);
+ return StringUtil.isNotEmpty(contentType) && contentType.contains(CONTENT_TYPE);
+ }
+
+ @Override
+ public byte[] getRequest(HttpServletRequest request, ServletAdapter adapter) {
+ if (request == null || adapter == null) {
+ return new byte[0];
+ }
+ return adapter.getRequestBytes(request);
+ }
+
+ @Override
+ public byte[] getResponse(HttpServletResponse response, ServletAdapter adapter) {
+ return new byte[0];
+ }
+}
+
+
+
+
diff --git a/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/ApplicationXmlBodyConverter.java b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/ApplicationXmlBodyConverter.java
new file mode 100644
index 000000000..aa84bd6d4
--- /dev/null
+++ b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/ApplicationXmlBodyConverter.java
@@ -0,0 +1,31 @@
+package io.arex.inst.httpservlet.convert.impl;
+
+import io.arex.agent.bootstrap.util.StringUtil;
+import io.arex.inst.httpservlet.adapter.ServletAdapter;
+import io.arex.inst.httpservlet.convert.HttpMessageConverter;
+
+
+public class ApplicationXmlBodyConverter implements HttpMessageConverter {
+
+ private static final String CONTENT_TYPE = "application/xml";
+
+ @Override
+ public boolean match(HttpServletRequest request, HttpServletResponse response, ServletAdapter adapter) {
+ if (request == null || response ==null || adapter == null) {
+ return false;
+ }
+ String contentType = adapter.getContentType(request);
+ return StringUtil.isNotEmpty(contentType) && contentType.contains(CONTENT_TYPE);
+ }
+
+ @Override
+ public byte[] getRequest(HttpServletRequest request, ServletAdapter adapter) {
+ return new byte[0];
+ }
+
+ @Override
+ public byte[] getResponse(HttpServletResponse response, ServletAdapter adapter) {
+ return new byte[0];
+ }
+
+}
\ No newline at end of file
diff --git a/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/DefaultHttpMessageConverter.java b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/DefaultHttpMessageConverter.java
new file mode 100644
index 000000000..33ddf83ee
--- /dev/null
+++ b/arex-instrumentation/servlet/arex-httpservlet/src/main/java/io/arex/inst/httpservlet/convert/impl/DefaultHttpMessageConverter.java
@@ -0,0 +1,35 @@
+package io.arex.inst.httpservlet.convert.impl;
+
+import io.arex.inst.httpservlet.adapter.ServletAdapter;
+import io.arex.inst.httpservlet.convert.HttpMessageConverter;
+
+public class DefaultHttpMessageConverter implements HttpMessageConverter {
+
+ private DefaultHttpMessageConverter() {
+
+ }
+
+ private static class SingletonHolder {
+ private static final DefaultHttpMessageConverter INSTANCE = new DefaultHttpMessageConverter();
+ }
+
+ public static DefaultHttpMessageConverter getInstance() {
+ return SingletonHolder.INSTANCE;
+ }
+
+
+ @Override
+ public boolean match(HttpServletRequest request, HttpServletResponse response, ServletAdapter adapter) {
+ return false;
+ }
+
+ @Override
+ public byte[] getRequest(HttpServletRequest request, ServletAdapter adapter) {
+ return new byte[0];
+ }
+
+ @Override
+ public byte[] getResponse(HttpServletResponse response, ServletAdapter adapter) {
+ return new byte[0];
+ }
+}
diff --git a/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/HttpMessageConvertFactoryTest.java b/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/HttpMessageConvertFactoryTest.java
new file mode 100644
index 000000000..6778462f2
--- /dev/null
+++ b/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/HttpMessageConvertFactoryTest.java
@@ -0,0 +1,51 @@
+package io.arex.inst.httpservlet.convert;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV3;
+import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV5;
+import io.arex.inst.httpservlet.convert.impl.DefaultHttpMessageConverter;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class HttpMessageConvertFactoryTest {
+
+ HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class);
+ HttpServletResponse mockResponse = Mockito.mock(HttpServletResponse.class);
+ ServletAdapterImplV3 instance3 = ServletAdapterImplV3.getInstance();
+ ServletAdapterImplV5 instance5 = ServletAdapterImplV5.getInstance();
+ jakarta.servlet.http.HttpServletRequest mockRequest5 = Mockito.mock(jakarta.servlet.http.HttpServletRequest.class);
+ jakarta.servlet.http.HttpServletResponse mockResponse5 = Mockito.mock(jakarta.servlet.http.HttpServletResponse.class);
+
+ @BeforeEach
+ void setUp() {
+ }
+
+ @AfterEach
+ void tearDown() {
+ }
+
+ @Test
+ void getOne(){
+ when(mockRequest.getContentType()).thenReturn("application/json");
+ when(mockRequest5.getContentType()).thenReturn("application/json");
+ assertNotNull(HttpMessageConvertFactory.getSupportedConverter(mockRequest,mockResponse,instance3));
+ assertNotNull(HttpMessageConvertFactory.getSupportedConverter(mockRequest5,mockResponse5,instance5));
+ }
+
+ @Test
+ void getDefault(){
+ when(mockRequest.getContentType()).thenReturn("application/jn");
+ when(mockRequest5.getContentType()).thenReturn("application/jn");
+
+ assertTrue(HttpMessageConvertFactory.getSupportedConverter(mockRequest,mockResponse,instance3) instanceof DefaultHttpMessageConverter);
+ assertTrue(HttpMessageConvertFactory.getSupportedConverter(mockRequest5,mockResponse5,instance5) instanceof DefaultHttpMessageConverter);
+ }
+
+}
diff --git a/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/impl/ApplicationJsonBodyConvertTest.java b/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/impl/ApplicationJsonBodyConvertTest.java
new file mode 100644
index 000000000..38830c02f
--- /dev/null
+++ b/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/impl/ApplicationJsonBodyConvertTest.java
@@ -0,0 +1,87 @@
+package io.arex.inst.httpservlet.convert.impl;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+
+import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV3;
+import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV5;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class ApplicationJsonBodyConvertTest {
+
+ HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class);
+ HttpServletResponse mockResponse = Mockito.mock(HttpServletResponse.class);
+
+ ServletAdapterImplV3 instance3 = ServletAdapterImplV3.getInstance();
+ ServletAdapterImplV5 instance5 = ServletAdapterImplV5.getInstance();
+ jakarta.servlet.http.HttpServletRequest mockRequest5 = Mockito.mock(jakarta.servlet.http.HttpServletRequest.class);
+ jakarta.servlet.http.HttpServletResponse mockResponse5 = Mockito.mock(jakarta.servlet.http.HttpServletResponse.class);
+
+
+ static ApplicationJsonBodyConverter applicationJsonBodyConvert = null;
+
+
+
+ @BeforeEach
+ void setUp() {
+ applicationJsonBodyConvert = new ApplicationJsonBodyConverter();
+
+ }
+
+ @AfterEach
+ void tearDown() {
+ }
+
+ @Test
+ void match() {
+ when(mockRequest.getContentType()).thenReturn("application/json");
+ when(mockRequest5.getContentType()).thenReturn("application/json");
+ assertEquals(true, applicationJsonBodyConvert.match(mockRequest,mockResponse,instance3));
+ assertEquals(true, applicationJsonBodyConvert.match(mockRequest5,mockResponse5,instance5));
+ }
+
+
+ @Test
+ void notMatch1() {
+ when(mockRequest.getContentType()).thenReturn("application/jn");
+ when(mockRequest5.getContentType()).thenReturn("application/n");
+ assertEquals(false, applicationJsonBodyConvert.match(mockRequest,mockResponse,instance3));
+ assertEquals(false, applicationJsonBodyConvert.match(mockRequest5,mockResponse5,instance5));
+ }
+
+
+ @Test
+ void notMatch2() {
+ assertEquals(false, applicationJsonBodyConvert.match(null,mockResponse,instance3));
+ assertEquals(false, applicationJsonBodyConvert.match(null,mockResponse5,instance5));
+ }
+
+
+ @Test
+ void get0Request() {
+ assertEquals(0, applicationJsonBodyConvert.getRequest(null,instance3).length);
+ assertEquals(0, applicationJsonBodyConvert.getRequest(null,instance5).length);
+ }
+
+ @Test
+ void getRequest() {
+ assertEquals(0, applicationJsonBodyConvert.getRequest(instance3.wrapRequest(mockRequest),instance3).length);
+ assertEquals(0, applicationJsonBodyConvert.getRequest(instance5.wrapRequest(mockRequest5),instance5).length);
+ }
+
+
+ @Test
+ void getResponse() {
+ assertEquals(0, applicationJsonBodyConvert.getResponse(instance3.wrapResponse(mockResponse),instance3).length);
+ assertEquals(0, applicationJsonBodyConvert.getResponse(instance5.wrapResponse(mockResponse5),instance5).length);
+ }
+
+}
diff --git a/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/impl/ApplicationXmlBodyConvertTest.java b/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/impl/ApplicationXmlBodyConvertTest.java
new file mode 100644
index 000000000..09cb0276f
--- /dev/null
+++ b/arex-instrumentation/servlet/arex-httpservlet/src/test/java/io/arex/inst/httpservlet/convert/impl/ApplicationXmlBodyConvertTest.java
@@ -0,0 +1,86 @@
+package io.arex.inst.httpservlet.convert.impl;
+
+import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV3;
+import io.arex.inst.httpservlet.adapter.impl.ServletAdapterImplV5;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.Mockito.when;
+
+public class ApplicationXmlBodyConvertTest {
+
+ HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class);
+ HttpServletResponse mockResponse = Mockito.mock(HttpServletResponse.class);
+
+ ServletAdapterImplV3 instance3 = ServletAdapterImplV3.getInstance();
+ ServletAdapterImplV5 instance5 = ServletAdapterImplV5.getInstance();
+ jakarta.servlet.http.HttpServletRequest mockRequest5 = Mockito.mock(jakarta.servlet.http.HttpServletRequest.class);
+ jakarta.servlet.http.HttpServletResponse mockResponse5 = Mockito.mock(jakarta.servlet.http.HttpServletResponse.class);
+
+
+ static ApplicationXmlBodyConverter applicationXmlBodyConvert = null;
+
+
+
+ @BeforeEach
+ void setUp() {
+ applicationXmlBodyConvert = new ApplicationXmlBodyConverter();
+
+ }
+
+ @AfterEach
+ void tearDown() {
+ }
+
+ @Test
+ void match() {
+ when(mockRequest.getContentType()).thenReturn("application/xml");
+ when(mockRequest5.getContentType()).thenReturn("application/xml");
+ assertEquals(true, applicationXmlBodyConvert.match(mockRequest,mockResponse,instance3));
+ assertEquals(true, applicationXmlBodyConvert.match(mockRequest5,mockResponse5,instance5));
+ }
+
+
+ @Test
+ void notMatch1() {
+ when(mockRequest.getContentType()).thenReturn("application/xl");
+ when(mockRequest5.getContentType()).thenReturn("application/xl");
+ assertEquals(false, applicationXmlBodyConvert.match(mockRequest,mockResponse,instance3));
+ assertEquals(false, applicationXmlBodyConvert.match(mockRequest5,mockResponse5,instance5));
+ }
+
+
+ @Test
+ void notMatch2() {
+ assertEquals(false, applicationXmlBodyConvert.match(null,mockResponse,instance3));
+ assertEquals(false, applicationXmlBodyConvert.match(null,mockResponse5,instance5));
+ }
+
+
+ @Test
+ void get0Request() {
+ assertEquals(0, applicationXmlBodyConvert.getRequest(null,instance3).length);
+ assertEquals(0, applicationXmlBodyConvert.getRequest(null,instance5).length);
+ }
+
+ @Test
+ void getRequest() {
+ assertEquals(0, applicationXmlBodyConvert.getRequest(instance3.wrapRequest(mockRequest),instance3).length);
+ assertEquals(0, applicationXmlBodyConvert.getRequest(instance5.wrapRequest(mockRequest5),instance5).length);
+ }
+
+
+ @Test
+ void getResponse() {
+ assertEquals(0, applicationXmlBodyConvert.getResponse(instance3.wrapResponse(mockResponse),instance3).length);
+ assertEquals(0, applicationXmlBodyConvert.getResponse(instance5.wrapResponse(mockResponse5),instance5).length);
+ }
+
+}