SpringBoot Keycloak NoSuchMethodError: javax.ws.rs.core.UriBuilder.resolveTemplates

Gre*_*orz 6 spring-boot keycloak javax

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

目前我正在尝试使用“admin-client-keycloak”访问我的 Keycloak 服务器

但是在通话中:

Response response = getInstance().realm(REALM).users().create(user);
Run Code Online (Sandbox Code Playgroud)

我得到错误:

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]
Run Code Online (Sandbox Code Playgroud)

老实说:我不是 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>
Run Code Online (Sandbox Code Playgroud)

错误来自“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>
Run Code Online (Sandbox Code Playgroud)

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

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

小智 15

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

     <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>
Run Code Online (Sandbox Code Playgroud)


Bat*_*han 3

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

  1. keycloak-admin-client 版本应与您的 keycloak 服务器版本相同。
  2. 向 pom 添加额外的依赖项(必须添加版本,对于 keycloak 3.0.0.Final => Resteasy dependentecies 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>
    
    Run Code Online (Sandbox Code Playgroud)

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

编辑,

请参阅由于“未知资源”而无法通过 keycloak-admin-client 将用户添加到 Keycloak

我希望这些能有所帮助。