1818import com .jd .live .agent .bootstrap .util .type .FieldAccessor ;
1919import org .springframework .http .HttpHeaders ;
2020import org .springframework .web .reactive .function .client .WebClientResponseException ;
21+ import org .springframework .web .server .ServerWebExchange ;
22+
23+ import java .util .Arrays ;
24+ import java .util .List ;
25+ import java .util .stream .Collectors ;
2126
2227import static com .jd .live .agent .bootstrap .util .type .FieldAccessorFactory .getAccessor ;
2328import static com .jd .live .agent .core .util .type .ClassUtils .loadClass ;
@@ -29,20 +34,68 @@ public class CloudUtils {
2934
3035 private static final String TYPE_WEB_CLIENT_RESPONSE_EXCEPTION = "org.springframework.web.reactive.function.client.WebClientResponseException" ;
3136
32- private static final Class <?> CLASS_WEB_CLIENT_RESPONSE_EXCEPTION = loadClass (TYPE_WEB_CLIENT_RESPONSE_EXCEPTION , HttpHeaders .class .getClassLoader ());
37+ private static final ClassLoader CLASS_LOADER = HttpHeaders .class .getClassLoader ();
38+
39+ private static final Class <?> CLASS_WEB_CLIENT_RESPONSE_EXCEPTION = loadClass (TYPE_WEB_CLIENT_RESPONSE_EXCEPTION , CLASS_LOADER );
3340
3441 private static final String TYPE_HANDLER_METHOD = "org.springframework.web.method.HandlerMethod" ;
3542
36- private static final Class <?> CLASS_HANDLER_METHOD = loadClass (TYPE_HANDLER_METHOD , HttpHeaders . class . getClassLoader () );
43+ private static final Class <?> CLASS_HANDLER_METHOD = loadClass (TYPE_HANDLER_METHOD , CLASS_LOADER );
3744
3845 private static final FieldAccessor ACCESSOR_HANDLER = getAccessor (CLASS_HANDLER_METHOD , "bean" );
3946
4047 private static final String TYPE_HANDLER_RESULT = "org.springframework.web.reactive.HandlerResult" ;
4148
42- private static final Class <?> CLASS_HANDLER_RESULT = loadClass (TYPE_HANDLER_RESULT , HttpHeaders . class . getClassLoader () );
49+ private static final Class <?> CLASS_HANDLER_RESULT = loadClass (TYPE_HANDLER_RESULT , CLASS_LOADER );
4350
4451 private static final FieldAccessor ACCESSOR_EXCEPTION_HANDLER = getAccessor (CLASS_HANDLER_RESULT , "exceptionHandler" );
4552
53+ private static final String CONTROLLER_TYPE = "org.springframework.web.servlet.mvc.Controller" ;
54+ private static final Class <?> CONTROLLER_CLASS = loadClass (CONTROLLER_TYPE , CLASS_LOADER );
55+ private static final String ERROR_CONTROLLER_TYPE = "org.springframework.boot.web.servlet.error.ErrorController" ;
56+ private static final Class <?> ERROR_CONTROLLER_CLASS = loadClass (ERROR_CONTROLLER_TYPE , CLASS_LOADER );
57+ private static final String RESOURCE_HANDLER_TYPE = "org.springframework.web.servlet.resource.ResourceHttpRequestHandler" ;
58+ private static final Class <?> RESOURCE_HANDLER_CLASS = loadClass (RESOURCE_HANDLER_TYPE , CLASS_LOADER );
59+ private static final String ACTUATOR_SERVLET_TYPE = "org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$WebMvcEndpointHandlerMethod" ;
60+ private static final Class <?> ACTUATOR_SERVLET_CLASS = loadClass (ACTUATOR_SERVLET_TYPE , CLASS_LOADER );
61+ private static final String API_RESOURCE_CONTROLLER_TYPE = "springfox.documentation.swagger.web.ApiResourceController" ;
62+ private static final Class <?> API_RESOURCE_CONTROLLER_CLASS = loadClass (API_RESOURCE_CONTROLLER_TYPE , CLASS_LOADER );
63+ private static final String SWAGGER2_CONTROLLER_WEB_MVC_TYPE = "springfox.documentation.swagger2.web.Swagger2ControllerWebMvc" ;
64+ private static final Class <?> SWAGGER2_CONTROLLER_WEB_MVC_CLASS = loadClass (SWAGGER2_CONTROLLER_WEB_MVC_TYPE , CLASS_LOADER );
65+ private static final String OPEN_API_RESOURCE_TYPE = "org.springdoc.webmvc.api.OpenApiResource" ;
66+ private static final Class <?> OPEN_API_RESOURCE_CLASS = loadClass (OPEN_API_RESOURCE_TYPE , CLASS_LOADER );
67+ private static final String MULTIPLE_OPEN_API_RESOURCE_TYPE = "org.springdoc.webmvc.api.MultipleOpenApiResource" ;
68+ private static final Class <?> MULTIPLE_OPEN_API_RESOURCE_CLASS = loadClass (MULTIPLE_OPEN_API_RESOURCE_TYPE , CLASS_LOADER );
69+ private static final String SWAGGER_CONFIG_RESOURCE_TYPE = "org.springdoc.webmvc.ui.SwaggerConfigResource" ;
70+ private static final Class <?> SWAGGER_CONFIG_RESOURCE_CLASS = loadClass (SWAGGER_CONFIG_RESOURCE_TYPE , CLASS_LOADER );
71+ private static final String SWAGGER_UI_HOME_TYPE = "org.springdoc.webmvc.ui.SwaggerUiHome" ;
72+ private static final Class <?> SWAGGER_UI_HOME_CLASS = loadClass (SWAGGER_UI_HOME_TYPE , CLASS_LOADER );
73+ private static final String SWAGGER_WELCOME_COMMON_TYPE = "org.springdoc.webmvc.ui.SwaggerWelcomeCommon" ;
74+ private static final Class <?> SWAGGER_WELCOME_COMMON_CLASS = loadClass (SWAGGER_WELCOME_COMMON_TYPE , CLASS_LOADER );
75+ private static final String ACTUATOR_TYPE = "org.springframework.boot.actuate.endpoint.web.reactive.AbstractWebFluxEndpointHandlerMapping$WebFluxEndpointHandlerMethod" ;
76+ private static final Class <?> ACTUATOR_CLASS = loadClass (ACTUATOR_TYPE , ServerWebExchange .class .getClassLoader ());
77+ private static final String RESOURCE_WEB_HANDLER_TYPE = "org.springframework.web.reactive.resource.ResourceWebHandler" ;
78+ private static final Class <?> RESOURCE_WEB_HANDLER_CLASS = loadClass (RESOURCE_WEB_HANDLER_TYPE , ServerWebExchange .class .getClassLoader ());
79+ private static final String SWAGGER2_CONTROLLER_WEBFLUX_TYPE = "springfox.documentation.swagger2.web.Swagger2ControllerWebFlux" ;
80+ private static final Class <?> SWAGGER2_CONTROLLER_WEBFLUX_CLASS = loadClass (SWAGGER2_CONTROLLER_WEBFLUX_TYPE , ServerWebExchange .class .getClassLoader ());
81+
82+ private static final List <Class <?>> SYSTEM_HANDLERS = Arrays .asList (
83+ CONTROLLER_CLASS ,
84+ RESOURCE_HANDLER_CLASS ,
85+ RESOURCE_WEB_HANDLER_CLASS ,
86+ ERROR_CONTROLLER_CLASS ,
87+ API_RESOURCE_CONTROLLER_CLASS ,
88+ ACTUATOR_CLASS ,
89+ OPEN_API_RESOURCE_CLASS ,
90+ MULTIPLE_OPEN_API_RESOURCE_CLASS ,
91+ SWAGGER_CONFIG_RESOURCE_CLASS ,
92+ SWAGGER_UI_HOME_CLASS ,
93+ SWAGGER_WELCOME_COMMON_CLASS ,
94+ SWAGGER2_CONTROLLER_WEB_MVC_CLASS ,
95+ SWAGGER2_CONTROLLER_WEBFLUX_CLASS ,
96+ ACTUATOR_SERVLET_CLASS
97+ ).stream ().filter (v -> v != null ).collect (Collectors .toList ());
98+
4699 /**
47100 * Creates writable copy of HTTP headers.
48101 *
@@ -61,6 +114,17 @@ public static <T> T getExceptionHandler(Object handlerResult) {
61114 return ACCESSOR_EXCEPTION_HANDLER != null && handlerResult != null && CLASS_HANDLER_RESULT .isInstance (handlerResult ) ? (T ) ACCESSOR_EXCEPTION_HANDLER .get (handlerResult ) : null ;
62115 }
63116
117+ public static boolean isSystemHandler (Object handler ) {
118+ if (handler != null ) {
119+ for (Class <?> clazz : SYSTEM_HANDLERS ) {
120+ if (clazz .isInstance (handler )) {
121+ return true ;
122+ }
123+ }
124+ }
125+ return false ;
126+ }
127+
64128 /**
65129 * Safely extracts error message from exception, including WebClient response body when available.
66130 *
0 commit comments