Я добавил интеграцию 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)