You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keycloak OIDC Adapter 22.0.5不支持JakartaEE的解决方案咨询

Keycloak OIDC Adapter 22.0.5 不支持Jakarta EE的解决办法

问题背景

使用Keycloak OIDC Adapter 22.0.5时,发现该版本依赖Java EE的javax.servlet API(源码中明确导入javax.servlet.http.HttpServletResponse),无法直接在Jakarta EE环境下运行。同时引入Java EE和Jakarta EE API包后,出现如下报错:

org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
... 37 more
Caused by: java.lang.NoSuchMethodError: 'javax.servlet.ServletContext org.apache.catalina.Context.getServletContext()'
at org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.keycloakInit(AbstractKeycloakAuthenticatorValve.java:111)
at org.keycloak.adapters.tomcat.AbstractKeycloakAuthenticatorValve.lifecycleEvent(AbstractKeycloakAuthenticatorValve.java:70)
at ...

报错核心原因是:Jakarta EE环境下Tomcat的getServletContext()返回jakarta.servlet.ServletContext类型,但适配器仍在寻找javax.servlet.ServletContext的方法签名,导致方法匹配失败。

可行解决办法

1. 升级到Jakarta EE兼容的Keycloak适配器版本

Keycloak官方已推出针对Jakarta EE的适配包,建议升级到23.x及以上版本,同时替换原有依赖:

  • 将原keycloak-oidc-adapter等Java EE版本依赖,替换为keycloak-jakarta-oidc-adapter
  • 确保项目中所有Servlet相关依赖统一使用Jakarta EE版本(如jakarta.servlet:jakarta.servlet-api)

2. 改用Jakarta Servlet Filter适配方案

放弃传统的Tomcat Valve配置,使用官方推荐的基于Jakarta Servlet Filter的适配方式:

  • 引入keycloak-jakarta-servlet-filter-adapter依赖
  • 在web.xml或通过注解配置Keycloak Filter及映射规则,替代原Valve配置
  • 同步配置realm地址、认证服务器地址等Keycloak初始化参数

3. 临时使用API桥接工具(仅过渡用)

若暂时无法升级适配器,可使用Tomcat提供的迁移桥接工具,实现javax.servlet到jakarta.servlet的调用转换:

  • 引入依赖org.apache.tomcat:tomcat-jakartaee-migration
  • 在Tomcat启动参数中添加-Dorg.apache.tomcat.jakartaee-migration.enabled=true启用转换
  • 注意:该方案为临时过渡方案,存在兼容性风险,不建议长期使用

内容的提问来源于stack exchange,提问作者cypre-midi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 10:02:13