Servlets 你能解释一下弹簧靴螺纹吗;servlet init()与servlet请求中的类加载器主体?
我们有一个工作Servlets 你能解释一下弹簧靴螺纹吗;servlet init()与servlet请求中的类加载器主体?,servlets,classloader,birt,spring-boot,struts1,Servlets,Classloader,Birt,Spring Boot,Struts1,我们有一个工作spring-boot的应用程序,使用嵌入式Tomcat,其中一个servlet是遗留的struts1.3.10(不问)。这是非常好的工作 或者直到我们添加了BIRTviewerservlet,它init()code更改了线程的类加载器 总之,在@configuration中,Struts Servlet和BIRT Servlet都是正常的ServletRegistrationBeans 在init()中,正在执行以下操作: Thread.currentThread().setCo
spring-boot
的应用程序,使用嵌入式Tomcat,其中一个servlet是遗留的struts1.3.10(不问)。这是非常好的工作
或者直到我们添加了BIRT
viewerservlet,它init()
code更改了线程的类加载器
总之,在@configuration
中,Struts Servlet和BIRT Servlet都是正常的ServletRegistrationBean
s
在init()
中,正在执行以下操作:
Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
应用程序运行后,在每个对的请求中,它会尝试从预填充的HashMap解析所需的属性,其中键是类加载器,但找不到匹配项:
ClassLoader cl = Thread.currentThread().getContextClassLoader();
这就是结果:
2014-06-10 08:33:28.971错误16572-[nio-9087-exec-4]o.a.c.c.c.[/].[ActionServlet]:路径[]的上下文中Servlet[ActionServlet]的Servlet.service()引发了异常[找不到目录“struts]”,并导致根本原因
我解决这个问题的方法是在init()完成之前,通过扩展BIRT servlet来还原类加载器:
public class BirtEngineServletWorkaround extends BirtEngineServlet {
@Override
public void init(ServletConfig config) throws ServletException {
ClassLoader savedClassLoader = Thread.currentThread().getContextClassLoader();
super.init(config);
//return classloader to this thread o_O!
Thread.currentThread().setContextClassLoader(savedClassLoader);
}
}
问题:为什么允许更改线程的类加载器?这种设置或在这种特殊情况下获取类加载器是错误的吗?如果类加载器不在嵌入式容器中,那么类加载器就可以了吗?线程的类加载器应该是可变的吗?有人能这么好心地教训我一下吗