【问题标题】:SpringBoot Keycloak NoSuchMethodError: javax.ws.rs.core.UriBuilder.resolveTemplatesSpringBoot Keycloak NoSuchMethodError:javax.ws.rs.core.UriBuilder.resolveTemplates
【发布时间】:2026-02-10 02:25:02
【问题描述】:

我的 SpringBoot 应用程序中的 POM 可能存在问题。

目前我正在尝试使用 “管理员客户端密钥斗篷”

但在通话中:

Response response = getInstance().realm(REALM).users().create(user);

我得到错误:

java.lang.NoSuchMethodError: javax.ws.rs.core.UriBuilder.resolveTemplates(Ljava/util/Map;)Ljavax/ws/rs/core/UriBuilder;
        at org.jboss.resteasy.client.jaxrs.internal.ClientWebTarget.resolveTemplates(ClientWebTarget.java:178) ~[resteasy-client-3.5.1.Final.jar:3.5.1.Final]
        at org.jboss.resteasy.client.jaxrs.internal.proxy.SubResourceInvoker.invoke(SubResourceInvoker.java:65) ~[resteasy-client-3.5.1.Final.jar:3.5.1.Final]
        at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76) ~[resteasy-client-3.5.1.Final.jar:3.5.1.Final]
        at com.sun.proxy.$Proxy198.realm(Unknown Source) ~[na:na]
        at org.keycloak.admin.client.Keycloak.realm(Keycloak.java:118) ~[keycloak-admin-client-3.4.3.Final.jar:3.4.3.Final]

说实话:我不是 Maven 专家,我是从几个网络灵魂中拼凑出来的,我希望有些部分仍然过时或其他什么。

POM 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.5.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>1.5.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
        <scope>runtime</scope>
    </dependency>

    <!-- Keycloak -->
    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.keycloak</groupId>
        <artifactId>keycloak-admin-client</artifactId>
        <version>3.4.3.Final</version>
    </dependency>

    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-client</artifactId>
        <version>3.5.1.Final</version>
    </dependency>

    <!-- JUnit -->
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.keycloak.bom</groupId>
            <artifactId>keycloak-adapter-bom</artifactId>
            <version>3.4.3.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

“keycloak-admin-client”模块发生错误。

现在主要的问题是:

  • 有什么问题?或者它真的是“keycloak-admin-client”版本中的一个错误?

我想这不会导致我提出第二个问题:

  • 在这种情况下,我怎样才能知道我需要改变什么?

提前感谢所有建议。我主要想学习如何在未来自己解决这些问题。

亲切的问候 格雷戈尔

编辑:

好吧,我又进了一步,但问题仍然存在。

我在这里向您展示的 POM 是用于其他项目的库的 POM。 这些项目有一个“spring-Boot-starter”,它使用“jersey”版本:1.54。

所以问题似乎很清楚。 我在最终项目 POM 中添加了“jersey 2.0.2”依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jersey</artifactId>
        <version>2.0.2.RELEASE</version>
    </dependency>

但问题仍然存在。 如何强制 maven 使用 2.0.2 版本并覆盖 1.5.?

只添加依赖似乎没有帮助。

【问题讨论】:

    标签: spring-boot keycloak javax


    【解决方案1】:

    其他一些依赖项正在使用不同版本的 lib jsr311-api。就我而言,它是尤里卡客户端。我刚刚在 pom 中添加了一个具有此依赖项的排除项,它起作用了

         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>javax.ws.rs</groupId>
                    <artifactId>jsr311-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    

    【讨论】:

    • 这是我的问题的正确答案。你拯救了我的一天,谢谢:)
    【解决方案2】:

    请确保您的项目中存在 UriBuilder 类。并确保您的项目中只存在一个 UriBuilder 类(版本)。 (在你的项目上可以有多个不同的版本。)不同的版本可以重叠。

    1. keycloak-admin-client 版本应与您的 keycloak 服务器版本相同。
    2. 向 pom 添加额外的依赖项(必须添加版本,对于 keycloak 3.0.0.Final => resteasy 依赖项 3.5.0.Final 对我有用。必须遵守依赖项。)

          <dependency>
              <groupId>org.keycloak</groupId>
              <artifactId>keycloak-admin-client</artifactId>
          </dependency>
          <dependency>
              <groupId>org.jboss.resteasy</groupId>
              <artifactId>resteasy-client</artifactId>
          </dependency>
          <dependency>
              <groupId>org.jboss.resteasy</groupId>
              <artifactId>resteasy-jackson2-provider</artifactId>
          </dependency>
          <dependency>
              <groupId>org.jboss.resteasy</groupId>
              <artifactId>resteasy-multipart-provider</artifactId>
          </dependency>
      

    注意:这是我的建议,如果您正在开发多层应用程序。您可以将项目划分为层。你可以划分你的spring boot starter app和keycloak访问层。并将这个新项目用作依赖项。

    编辑,

    Failed adding user by keycloak-admin-client to Keycloak due to "unknown resource"

    我希望这些能有所帮助。

    【讨论】: