繁体   English   中英

字节好友 - java.lang.NoClassDefFoundError: javax/servlet/ServletRequest

[英]Byte Buddy - java.lang.NoClassDefFoundError: javax/servlet/ServletRequest

我正在尝试检测javax.servlet.Servlet接口实现的service方法,如下所示:

.transform(
                        new AgentBuilder.Transformer.ForAdvice()
                                .include(MyAgent.class.getClassLoader())
                                .advice(
                                        named("service")
                                                .and(takesArgument(0, ServletRequest.class))
                                                .and(takesArgument(1, ServletResponse.class))
                                        , "com.MyAdvice"
                                )
                )

现在,如果我通过agentmain将此代理附加到已经运行的 Spring 引导应用程序 - 我在尝试访问任何 web 页面时看到以下异常

java.lang.LinkageError: loader constraint violation: when resolving method 'void javax.servlet.http.HttpServletRequestWrapper.<init>(javax.servlet.http.HttpServletRequest)' 
the class loader org.springframework.boot.loader.LaunchedURLClassLoader @18be83e4 of the current class,
org/springframework/web/servlet/resource/ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper, and the class loader 'app' for the method's defining class, javax/servlet/http/HttpServletRequestWrapper, 
have different Class objects for the type javax/servlet/http/HttpServletRequest used in the signature (org.springframework.web.servlet.resource.ResourceUrlEncodingFilter$ResourceUrlEncodingRequestWrapper is in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @18be83e4, parent loader 'app'; javax.servlet.http.HttpServletRequestWrapper is in unnamed module of loader 'app')

我理解它是因为javax/servlet/http/HttpServletRequest实例是从 2 个不同的 jars 加载的 - 一个通过代理加载,另一个通过 spring 引导嵌入 tomcat。如果我尝试设置 scope,如代理的pom.xml do not388 中provided的那样 [ 因为我想要在代理捆绑 jar 中包含 servlet-api 并尝试使用已经提供的 servlet-api 实现从 Spring 启动],我得到Caused by: java.lang.NoClassDefFoundError: javax/servlet/ServletRequest - 可能是因为加载代理的类加载器不能'看不到 spring 启动提供的 servlet api。

是否有任何可能的解决方法或修复方法来解决这种情况? 感谢您的宝贵时间和反馈。

理想情况下,您的代理不包含此类。 相反,通过名称匹配类: takesArgument(0, named("javax.servlet.ServletRequest"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM