Keycloak管理客户端-javax.ws.rs.ProcessingException:RESTEASY003215

时间:2018-10-31 21:07:58

标签: java jboss resteasy keycloak

我正在使用Keycloak管理客户端(版本4.5.0.Final)并尝试执行一些简单的查询,例如查找用户。客户端代码在另一个Java服务器的插件模块中运行,而不是独立运行。代码如下:

    ...
    try {
        Keycloak kc = Keycloak.getInstance(URL, REALM, USER, PWD, CLIENT_ID);

        UserRepresentation kcuser = kc.realm(REALM).users().get(USER).toRepresentation();

        trace(String.format("Got user: %s",  kcuser.toString()));
    } catch (Exception e) {
        trace("Error authenticating: " + e);
    }
    ...

它成功创建了kc实例,但是在尝试查找用户时却创建了barfs。 这是错误:

javax.ws.rs.ProcessingException: RESTEASY003215: could not find writer for content-type application/x-www-form-urlencoded type: javax.ws.rs.core.Form$1
at org.jboss.resteasy.core.interception.ClientWriterInterceptorContext.throwWriterNotFoundException(ClientWriterInterceptorContext.java:40)
at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.getWriter(AbstractWriterInterceptorContext.java:146)
at org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:121)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.writeRequestBody(ClientInvocation.java:394)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.writeRequestBodyToOutputStream(ApacheHttpClient4Engine.java:666)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.buildEntity(ApacheHttpClient4Engine.java:631)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.loadHttpMethod(ApacheHttpClient4Engine.java:509)
at org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:310)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:439)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invokeSync(ClientInvoker.java:148)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:112)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
at com.sun.proxy.$Proxy362.grantToken(Unknown Source)
at org.keycloak.admin.client.token.TokenManager.grantToken(TokenManager.java:89)
at org.keycloak.admin.client.token.TokenManager.getAccessToken(TokenManager.java:69)
at org.keycloak.admin.client.token.TokenManager.getAccessTokenString(TokenManager.java:64)
at org.keycloak.admin.client.resource.BearerAuthFilter.filter(BearerAuthFilter.java:52)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.filterRequest(ClientInvocation.java:587)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:436)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invokeSync(ClientInvoker.java:148)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:112)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
at com.sun.proxy.$Proxy372.toRepresentation(Unknown Source)
...

我的pom具有最新的依赖关系,并且classpath似乎还可以,为什么不起作用呢?

<properties>
    <keycloak.version>4.5.0.Final</keycloak.version>
    <resteasy.version>3.6.1.Final</resteasy.version>

</properties>
<dependencies>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-admin-client</artifactId>
            <version>${keycloak.version}</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-client</artifactId>
            <version>${resteasy.version}</version>
        </dependency>       
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-multipart-provider</artifactId>
            <version>${resteasy.version}</version>
        </dependency>                   
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jackson2-provider</artifactId>
            <version>${resteasy.version}</version>
        </dependency>                               
    </dependencies>

1 个答案:

答案 0 :(得分:0)

我注意到在实例化一个新的Keycloak实例期间,resteasy在当前线程的帮助下检查here的可用提供程序。到目前为止,上一个3.9.1.Final(版本keycloak-admin-client)正在使用的11.0.0版本中。

在我的特定情况下,我们将keycloak-admin-clientgraphql-javaCompletableFuture.supplyAsync结合使用作为数据加载器。这意味着在某些情况下,如果没有进一步的配置,当前线程不是Thread的实例,而实际上是ForkJoinWorkerThread的实例。显然破坏了提供者的检索。

我仍然是Java的初学者,因此如果有人可以解释为什么registerProviders methodForkJoinWorkerThread不兼容的情况,我将感到非常高兴。

我在DZone上了解到,当您有2个以上的可用CPU时,JVM将commonPool的大小调整为两个线程。因此,我尝试并发现我的应用程序可以使用2个CPU,但是使用3个CPU时我会遇到相同的错误(RESTEASY003215)。

我当前的“解决方法”是在使用CompletableFuture.completedStage加载数据时使用keycloak-admin-client