Tomcat ClassCastException due to ClassLoaders



我在Tomcat中实现自己的身份验证过滤器时遇到了一些问题。当我部署项目时,我得到以下日志:

由java.lang.ClassCastException引起:classcom.somename.sec.sso.camunda.Key斗篷SSOAuthenticationProvider无法被铸造到类org.camunda.bpm.engine.rest.security.auth.AuthenticationProvider(com.somename.sec.sso.camunda.KeyclockSSOAuthenticationProvider位于加载器java.net.URLClassLoader@6fc6f14e的未命名模块;org.camunda.bpm.engine.rest.security.auth.AuthenticationProvider位于加载程序的未命名模块org.apache.catalina.loader.ParallelWebappClassLoader@7a498efa(

这很奇怪,因为我的Key斗篷SSOAuthenticationProvider实现了AuthenticationProvider。显然,铸造失败是由于不同级别的装载机造成的。我想当我定义Authentication Filter:时,在我的web.xml文件中转换失败

<!-- Container Based Authentication filter -->
<filter>
<filter-name>Container Based Authentication Filter</filter-name>
<filter-class>org.camunda.bpm.webapp.impl.security.auth.ContainerBasedAuthenticationFilter</filter-class>
<init-param>
<param-name>authentication-provider</param-name>
<param-value>com.somename.sec.sso.camunda.KeycloakSSOAuthenticationProvider</param-value>
</init-param>
</filter>

有没有办法强制使用与AuthenticationProvider相同的类加载器加载KeycloakSSOAuthenticationProvider?或者我应该如何处理这个问题?

我在Keycaptain中遇到了类似的铸造错误。对我来说,问题是在Tomcat(而不是嵌入式Tomcat(上运行key斗篷的部分设置中,您必须将许多key斗篷库文件复制到Tomcat_home/lib目录中。然后,您还需要那些可用于java代码的库,因此它们也包含在POM文件中。

解决方案是设置<范围>提供<范围>pom文件中的密钥斗篷依赖项。这样代码就会编译,但在运行时类路径上不会有两个版本的类。

最新更新