Keycloak 管理客户端 - javax.ws.rs.ProcessingException: RESTEASY003215
Posted
技术标签:
【中文标题】Keycloak 管理客户端 - javax.ws.rs.ProcessingException: RESTEASY003215【英文标题】:Keycloak admin client - javax.ws.rs.ProcessingException: RESTEASY003215 【发布时间】:2019-04-05 03:05:26 【问题描述】:我正在使用 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 实例,但是在尝试查找用户时会出错。 这是错误:
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 具有最新的依赖项,并且类路径似乎还可以,任何想法为什么这不起作用?
<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>
【问题讨论】:
在这里查看答案:***.com/questions/52610464/… 【参考方案1】:我注意到在一个新的Keycloak
实例的实例化过程中,resteasy 在当前线程的帮助下检查here 的可用提供程序。在版本3.9.1.Final
中,目前由最后一个keycloak-admin-client
使用(版本11.0.0
)。
在我的具体情况下,我们将keycloak-admin-client
与graphql-java
和CompletableFuture.supplyAsync
结合用于我们的数据加载器。这意味着在某些情况下,如果没有进一步的配置,当前线程不是Thread
的实例,而是实际上是ForkJoinWorkerThread
。这显然会破坏提供者的检索。
我仍然是 Java 的初学者,所以如果有人能解释为什么 registerProviders
method 不能与 ForkJoinWorkerThread
一起使用,我会很高兴。
我在 DZone 上了解到,当您有超过 2 个可用 CPU 时,JVM 会将 commonPool
调整为两个线程。因此,我尝试并注意到我的应用程序可以使用 2 个 CPU,但使用 3 个 CPU 时出现相同的错误 (RESTEASY003215)。
我目前的“解决方法”是在使用keycloak-admin-client
加载数据时使用CompletableFuture.completedStage
。
【讨论】:
以上是关于Keycloak 管理客户端 - javax.ws.rs.ProcessingException: RESTEASY003215的主要内容,如果未能解决你的问题,请参考以下文章
javax.ws.rs.client.Client l- 来自本地文件的 JSON
找不到类型的上下文数据:javax.ws.rs.core.UriInfo