当前位置: 首页 > 知识库问答 >
问题:

嵌入式Keyclope springboot应用程序,将Keyclope从12升级到14

鱼安然
2023-03-14

您好,我有一个带有嵌入式按键锁的SpringBoot应用程序,使用下面的示例 https://www.baeldung.com/keycloak-embedded-in-spring-boot-app

我正在尝试将Keycloak从12升级到14,并将reeasy升级到3.15.1.Final,infinispan升级到11.0.9.Final。应用程序无法启动,并且除了 NullPointerException 之外,日志中没有太多内容。我正在尝试查看是否有人尝试过相同的方法,并有任何建议,因为日志中没有太多内容。谢谢

2021-07-07 10:02:05 [main] INFO  org.keycloak.services - KC-SERVICES0050: Initializing master realm
2021-07-07 10:02:07 [main] DEBUG org.keycloak.keys.GeneratedRsaKeyProviderFactory - Generated keys for master
2021-07-07 10:02:07 [main] DEBUG org.keycloak.keys.GeneratedHmacKeyProviderFactory - Generated secret for master
2021-07-07 10:02:07 [main] DEBUG org.keycloak.keys.GeneratedAesKeyProviderFactory - Generated secret for master
2021-07-07 10:02:07 [main] DEBUG org.keycloak.connections.jpa.updater.liquibase.lock.LiquibaseDBLockProvider - Going to release database lock namespace=KEYCLOAK_BOOT
2021-07-07 10:02:07 [main] DEBUG org.keycloak.connections.jpa.updater.liquibase.lock.CustomLockService - Going to release database lock
2021-07-07 10:02:07 [main] DEBUG org.keycloak.models.cache.infinispan.InfinispanUserCacheProviderFactory - Registered cluster listeners
2021-07-07 10:02:07 [main] DEBUG org.keycloak.executors.DefaultExecutorsProviderFactory - We are in managed environment. Executor 'java:jboss/ee/concurrency/executor/default' was available.
2021-07-07 10:02:07 [main] DEBUG org.keycloak.executors.DefaultExecutorsProviderFactory - Found executor for 'storage-provider-threads' under JNDI name 'java:jboss/ee/concurrency/executor/storage-provider-threads'
2021-07-07 10:02:07 [main] FATAL org.keycloak.services - java.lang.NullPointerException

2021-07-07 10:02:07 [main] DEBUG org.keycloak.executors.DefaultExecutorsProviderFactory - Found executor for 'storage-provider-threads' under JNDI name 'java:jboss/ee/concurrency/executor/storage-provider-threads'
$$$$$$$$$$$$$$$$Stachtrace$$$$$$$$$$$$$ : java.lang.NullPointerException
    at java.base/java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011)
    at java.base/java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006)
    at org.keycloak.executors.DefaultExecutorsProviderFactory.getExecutor(DefaultExecutorsProviderFactory.java:113)
    at org.keycloak.executors.DefaultExecutorsProviderFactory$1.getExecutor(DefaultExecutorsProviderFactory.java:68)
    at org.keycloak.utils.ServicesUtils.timeBoundOne(ServicesUtils.java:71)
    at org.keycloak.storage.AbstractStorageManager.mapEnabledStorageProvidersWithTimeout(AbstractStorageManager.java:135)
    at org.keycloak.storage.UserStorageManager.getUsersCount(UserStorageManager.java:374)
    at org.keycloak.models.cache.infinispan.UserCacheSession.getUsersCount(UserCacheSession.java:545)
    at org.keycloak.storage.user.UserQueryProvider.getUsersCount(UserQueryProvider.java:52)
    at org.keycloak.services.managers.ApplianceBootstrap.createMasterRealmUser(ApplianceBootstrap.java:99)

共有3个答案

姜志行
2023-03-14

我已将@mrieman建议的更改应用于初始baeldung.com教程。到目前为止,它适用于17.0.1版本的Keycloak。希望它能帮助到某人。我在Github上的存储库在这里

卢勇
2023-03-14

我用Keyclope 15做了同样的尝试,得到了同样的结果。似乎没有考虑KeyClope的ConcurrentHashMapStorageProvider。

编辑:在查看了keycloak的代码后,我发现MAP_STORAGE功能在默认情况下是禁用的(因为该功能被标记为实验性的)。要解决这个问题,您必须使用以下Java选项启动springboot应用程序:

-Dkeycloak.profile.feature.map_storage=enabled

不幸的是,我现在面临另一个nullPointerException...

丰飞龙
2023-03-14

在我们的Spring Boot/Servlet风格的应用程序中将嵌入式keycloak升级到15时,我们也有类似的模糊错误消息。但是我们最终通过浏览这个baeldung.com教程所基于的项目的代码/历史修复了它们;thomasdarimont的嵌入式Keycloak服务器运行在一个Spring Boot应用程序中。这个回购是对最初教程的一些升级;直到钥匙锁13。我们将历史记录与我们的代码进行了比较,并对从keycloak 11到13的每个版本逐步应用/测试修复。之后,从13到15的更新变得更容易理解了,错误也不那么神秘了。

我们的应用程序与Baeldung教程中给出的示例代码不完全一样,但下面是我们升级到Keycloak 15.0.1所需的更改列表。这些更改可能与您的项目不是1:1,但希望这些更改可以帮助某人节省一些时间。

>

  • 在<code>中,KeyClope应用程序bootstrap()</code>方法。(这里有一个修复示例)

    
    public class EmbeddedKeycloakApplication extends KeycloakApplication {
    ...

     //public EmbeddedKeycloakApplication() {
     //    createMasterRealmAdminUser();
     //    createBaeldungRealm();
     //}
    
     @Override
     protected ExportImportManager bootstrap() {
         final ExportImportManager exportImportManager = super.bootstrap();
         createMasterRealmAdminUser();
         createBaeldungRealm();
         return exportImportManager;
     }
    

    <代码>

    >

  • EmbeddedKeycloakConfig中,我们添加了几个新的bean引用/工厂(都在这里找到)

    公共类 EmbeddedKeycloakConfig { ...

     @Bean("fixedThreadPool")
     public ExecutorService fixedThreadPool() {
         return Executors.newFixedThreadPool(5);
     }
    
     @Bean
     @ConditionalOnMissingBean(name = "springBootPlatform")
     protected SimplePlatformProvider springBootPlatform() {
         return (SimplePlatformProvider) Platform.getPlatform();
     }
    

    <代码>

    >

  • 在我们的KeyClope服务器中。在json中,我们从mapStorage provider中删除了默认的“concurrenthashmap”名称,但仍然提供了Concurrent Hashmap属性。这与其他KeyClope 15示例相匹配。正如Paul提到的,需要启用map_storage,最简单的解决方案是使用系统属性-dkeymape.profile.feature。map_storage=enabled-dkeyclope.mapStorage.provider=concurrenthashmap。类似的例子可以在这里和这里的KeyClope测试套件中找到。然而,我们在使用这些系统属性时遇到了错误,并决定我们的代码不需要它。幸运的是,“地图存储”在本教程中没有特别提到;它仅在引用的教程代码中找到。因此,我们只是简单地匹配了其他KeyClope 13个示例,并删除了KeyClope服务器中的引用。json(如下所示)来消除空指针异常。

    //更改此选项:

     "mapStorage": {
         "provider": "${keycloak.mapStorage.provider:concurrenthashmap}",
         "concurrenthashmap": {
             "dir": "${project.build.directory:target}"
         }
     },
    

    //对此

     "mapStorage": {
         "provider": "${keycloak.mapStorage.provider:}",
         "concurrenthashmap": {
             "dir": "${project.build.directory:target}"
         } 
     },
    

    <代码>

    >

  • 使用钥匙斗篷版本升级了正确的infinispan和Rest版本。(教程代码参考)

     < keycloak.version>15.0.1</keycloak.version>
    
     < !-- these should be updated together with Keycloak -->
     < !-- check keycloak-dependencies-server-all effective pom -->
     < infinispan.version>11.0.9.Final</infinispan.version>
     < resteasy.version>3.15.1.Final/resteasy.version>
    

    <代码>

    >

  • 我们还在 SimplePlatformProvider 中添加了临时目录位置,因为此字段是必需的。注意:不建议将示例中使用的系统临时文件夹用于生产环境。

     @Override
     public File getTmpDirectory() {
         return System.getProperty("java.io.tmpdir");
     }
    

    <代码>

    我希望有人发现这个信息有用,祝你好运!

  •  类似资料:
    • 我已经按照http://reactivemongo.org/releases/0.11/documentation/tutorial/play2.html2.3上的说明进行了操作,但仍然得到了如下所示的stacktrace: ---(从SBT运行应用程序,启用自动重新加载)--- [信息]在/0:0:0:0:0:0:0:9000,播放-监听HTTP 请有人告诉我上面的stacktrace实际上是什

    • 我在旧的jetty版本中使用jetty.xml进行配置,如下所示: 已编写以下代码来调用此配置: 我试图使用jetty 9.4.43创建类似的配置: 使用新的jetty.xml,端口9096被公开,intelliJ运行所在的目录下的所有可用文件都可以访问,但FileProxyServlet url(即localhost:9096/cts/output)不可访问(显示HTTP错误404 Not Fo

    • 我不是SSL/TLS专家。但遇到以下情况 我们从一个供应商连接到一个webservice并且“安全策略”是TLSv1,所有的工作都像一个魅力。该供应商将该安全策略升级到TLSV1_2016。 从那时起通信就失败了。当他们重新回滚所有的工作。 这似乎已经足够了。 在AWS上,我发现了以下概述 TLSV1.2支持足以支持SSLv3 TLSV1.0 TLSv1_2016 TLSV1.1_2016 TLS

    • 我正在为我们的应用程序创建升级路径,在此过程中出现了几个问题。我想,我的配置经常在这种情况下使用,所以也许有人以前经历过。 简短的应用程序描述: JSF Web应用程序 ICE作为JSF框架(实际版本1.8.3最新是3.1) 接缝作为EJB/View之间的连接(实际是2.1.1,最新是2.2.2或3) 在JBoss 4.2.2中部署。GA(最新是7.1) 通过Hibernate/Seam Enti

    • 我正在将一组遗留应用程序升级到Spring Boot2.4.0,运行在OpenJDK8上,部署到Pivotal Cloud Foundry。 我将添加到我的和测试文件中: 仍然没有快乐--所有的测试都失败了。 我被我看到的其他链接弄糊涂了。这是的问题吗?我读到版本可能存在问题。我需要把它添加到我的应用程序吗?在升级之前,它从来不需要这种依赖关系:

    • 我正在使用spring boot 1.2.8和Mongo db 2.4.10。我计划将mongo db升级到3.2.0。 因此,对于当前的sprinb引导1.2.8,我在下面的pom中使用, 我在依赖层次结构中看到了mongo-java-driver版本2.12.5附带的 但是我在mongo java driver doc中看到,它说即使是2.14版本,它也不支持MongoDB3.2的所有特性(例