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);
}
}
问题:为什么允许更改线程的类加载器?这种设置或在这种特殊情况下获取类加载器是错误的吗?如果类加载器不在嵌入式容器中,那么类加载器就可以了吗?线程的类加载器应该是可变的吗?有人能这么好心地教训我一下吗