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

时间:2018-05-14 16:25:25

标签: spring-boot keycloak javax

我的SpringBoot App中的POM可能有问题。

目前我正在尝试使用。访问我的Keycloak服务器 "管理客户端 - keycloak"

但是在电话中:

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 dependecys:

<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>

错误发生在&#39; keycloak-admin-client&#39;模块。

现在的主要问题是:

  • 问题是什么?或者它是否真的是&#39; keycloak-admin-client&#39;?
  • 版本中的错误?

我想这不是第二个问题的原因:

  • 在这种情况下,我如何才能找到需要改变的内容?

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

亲切的问候 格里

修改

嗯,我更进一步,但问题仍然存在。

我在这里展示的POM是一个用于其他项目的库的POM。 这些项目有一个弹簧启动启动器&#39;正在使用&#39; jersey&#39;版本:1.54

所以问题似乎很明显。 我添加了&#39; jersey 2.0.2&#39;在最终项目POM中的依赖性

    <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。?

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

2 个答案:

答案 0 :(得分:8)

其他一些依赖项使用的是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>

答案 1 :(得分:0)

请确保您的项目中存在 UriBuilder 类。并确保您的项目中只存在一个 UriBuilder 类(版本)。 (对于您的项目,它可以是多个版本。)不同的版本可以重叠。

  1. keycloak-admin-client版本应与您的keycloak服务器版本相同。
  2. 为pom添加额外的依赖关系(必须添加版本,对于keycloak 3.0.0.Final =&gt; resteasy dependecies 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>
    
  3. 注意:如果您正在开发多层应用,这是我的建议。您可以将项目划分为图层。您可以划分您的spring boot starter app和keycloak访问层。并将这个新项目用作依赖。

    编辑

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

    我希望这些可以提供帮助。