Проблемы с загрузкой Spring / Spring Security / Keycloak Classloader - PullRequest
1 голос
/ 15 марта 2019

Я добавил интеграцию keycloak в существующее приложение Grails 3 (3.3.2), и по большей части он работает хорошо.Однако я время от времени получаю ClassCastExceptions или GroovyCastExceptions, пытаясь привести класс Foo к классу Foo.

Я понимаю, что двумя распространенными причинами этого являются дублированные включения класса или множественные загрузки класса в разные загрузчики классов.В ходе тщательной проверки я подтвердил (дамп кучи и -class: подробный обзор журнала), что рассматриваемые классы существуют не только один раз для каждого приложения, но также загружаются только один раз для каждого приложения.В частности, для приложений X, которые я запускаю, соответствующий класс загружается ровно X раз, каждый раз с помощью другого приложения WebappClassloader.

Один сложный фактор заключается в том, что я запускаю несколько приложений (скомпилированных для войн через * 1005).*) в том же экземпляре Tomcat.Каждое приложение включает в себя копию фляги, в которой находятся нарушающие классы.Насколько я понимаю, иерархия загрузчика классов Tomcat должна позволить это без проблем.

Далее следуют стеки и конфигурация сборки.У кого-нибудь есть предложения, как решить эту проблему дальше?

build.gradle

// relevant parts:
dependencies {
    compile "org.springframework.boot:spring-boot-starter-logging"
    compile "org.grails:grails-core"
    compile "org.springframework.boot:spring-boot-starter-actuator"
    provided "org.springframework.boot:spring-boot-starter-tomcat"
    compile "org.grails:grails-dependencies"
    compile "org.grails:grails-web-boot"
    compile "org.springframework.security:spring-security-core:4.2.3.RELEASE"
    compile "org.springframework.boot:spring-boot-starter-security:1.5.8.RELEASE"
    compile "org.keycloak:keycloak-spring-security-adapter:3.4.3.Final"
}

Исключения (усечены)

2019-03-14 13:42:39.396 [http-apr-8443-exec-3] ERROR o.s.b.w.s.ErrorPageFilter Forwarding to error page from request [/service/search/config] due to exception [org.grails.web.servlet.mvc.GrailsWebRequest cannot be cast to org.grails.web.servlet.mvc.GrailsWebRequest]
java.lang.ClassCastException: org.grails.web.servlet.mvc.GrailsWebRequest cannot be cast to org.grails.web.servlet.mvc.GrailsWebRequest
        at org.grails.web.servlet.mvc.GrailsWebRequest.lookup(GrailsWebRequest.java:435)
        at org.grails.web.servlet.mvc.GrailsWebRequest.inheritEncodingStateRegistry(GrailsWebRequest.java:127)
        at org.grails.web.servlet.mvc.GrailsWebRequest.<init>(GrailsWebRequest.java:108)

и

2019-03-14 16:06:50.938 [pool-54-thread-1] ERROR StackTrace Full Stack Trace:
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'MimeType { name=*/*,extension=all,parameters=[q:1.0] }' with class 'grails.web.mime.MimeType' to class 'grails.web.mime.MimeType'
    at org.grails.web.mime.HttpServletResponseExtension.getMimeTypesInternal(HttpServletResponseExtension.groovy:232)
    at org.grails.web.mime.HttpServletResponseExtension.getMimeTypeForRequest(HttpServletResponseExtension.groovy:147)
    at org.grails.web.mime.HttpServletResponseExtension.getMimeType(HttpServletResponseExtension.groovy:118)
    at org.grails.web.mime.DefaultMimeTypeResolver.resolveResponseMimeType(DefaultMimeTypeResolver.groovy:41)
...