Java: fixing multiple SCI initializations.

- Ignoring Tomcat WebSocket container initialization.
- Renaming application class loader to UnitClassLoader to avoid
development environment enablement in Spring Boot.

This closes #609 issue on GitHub.
This commit is contained in:
Max Romanov 2021-12-27 16:37:36 +03:00
parent f845283820
commit 818a78d82c
2 changed files with 21 additions and 4 deletions

View file

@ -37,6 +37,12 @@ some Perl applications failed to process the request body, notably with Plack.
</para> </para>
</change> </change>
<change type="bugfix">
<para>
some Spring Boot applications failed to start, notably with Grails.
</para>
</change>
</changes> </changes>

View file

@ -422,7 +422,7 @@ public class Context implements ServletContext, InitParams
processWebXml(root); processWebXml(root);
loader_ = new AppClassLoader(urls, loader_ = new UnitClassLoader(urls,
Context.class.getClassLoader().getParent()); Context.class.getClassLoader().getParent());
Class wsSession_class = WsSession.class; Class wsSession_class = WsSession.class;
@ -531,7 +531,7 @@ public class Context implements ServletContext, InitParams
} }
} }
private static class AppClassLoader extends URLClassLoader private static class UnitClassLoader extends URLClassLoader
{ {
static { static {
ClassLoader.registerAsParallelCapable(); ClassLoader.registerAsParallelCapable();
@ -547,7 +547,7 @@ public class Context implements ServletContext, InitParams
private ClassLoader system_loader; private ClassLoader system_loader;
public AppClassLoader(URL[] urls, ClassLoader parent) public UnitClassLoader(URL[] urls, ClassLoader parent)
{ {
super(urls, parent); super(urls, parent);
@ -1514,6 +1514,18 @@ public class Context implements ServletContext, InitParams
{ {
trace("loadInitializer: initializer: " + sci.getClass().getName()); trace("loadInitializer: initializer: " + sci.getClass().getName());
/*
Unit WebSocket container is a copy of Tomcat WsSci with own
transport implementation. Tomcat implementation will not work in
Unit and should be ignored here.
*/
if (sci.getClass().getName()
.equals("org.apache.tomcat.websocket.server.WsSci"))
{
trace("loadInitializer: ignore");
return;
}
HandlesTypes ann = sci.getClass().getAnnotation(HandlesTypes.class); HandlesTypes ann = sci.getClass().getAnnotation(HandlesTypes.class);
if (ann == null) { if (ann == null) {
trace("loadInitializer: no HandlesTypes annotation"); trace("loadInitializer: no HandlesTypes annotation");
@ -1558,7 +1570,6 @@ public class Context implements ServletContext, InitParams
try { try {
sci.onStartup(handles_classes, this); sci.onStartup(handles_classes, this);
metadata_complete_ = true;
} catch(Exception e) { } catch(Exception e) {
System.err.println("loadInitializer: exception caught: " + e.toString()); System.err.println("loadInitializer: exception caught: " + e.toString());
} }