将 quarkus-keycloak-admin-client-reactive 与其他 quarkus 反应式组件一起使用时,我不断收到 org.jboss.resteasy.reactive.common.core.BlockingNotAllowedException 。我想知道我做错了什么。
我写了一个简单的代码片段:
import io.smallrye.mutiny.Uni;
import jakarta.inject.Inject;
import jakarta.json.bind.Jsonb;
import jakarta.json.bind.JsonbBuilder;
import jakarta.json.bind.JsonbConfig;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.keycloak.admin.client.Keycloak;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
@Path( "/hello" )
public class GreetingResource {
@Inject
Keycloak keycloak;
@GET
@Produces( MediaType.APPLICATION_JSON )
public Uni< Response > hello( ) {
// Select the realm
return Uni.createFrom( ).item( keycloak.realms( ).realm( "myRealm" ) )
.flatMap( realmResource -> {
// Get the users resource
return Uni.createFrom( ).item( realmResource.users( ) )
.flatMap( users -> {
// Count all users in the realm
return Uni.createFrom( ).item( users.count( ) )
.map( count -> {
JsonbConfig jsonbConfig = ( new JsonbConfig( ) ).withNullValues( true ).withEncoding( StandardCharsets.UTF_8.name( ) );
Jsonb jsonb = JsonbBuilder.create( jsonbConfig );
return Response.status( Response.Status.OK )
.entity( jsonb.toJson( new HashMap<>( ) {{
put( "count", count );
}} ) )
.build( );
} );
} );
} );
}
}
我确保我通过 SmallRye 的 Uni 进行了所有 keycloak 呼叫。在 application.properties 上完成所有必要的配置;这是我的依赖项(Quarkus 3.7.3):
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-arc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-reactive-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-oidc-token-propagation-reactive</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-keycloak-authorization</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-rest-client-reactive-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-keycloak-admin-client-reactive</artifactId>
</dependency>
我的代码正确吗?
我仍然很困惑为什么会抛出 BlockingNotAllowedException 因为所有组件都是“反应性”的(或者至少它们都被标记为“反应性”)。
如果您能提供一些帮助,我们将不胜感激。谢谢。
多看看这个,这个预期的行为。 原因是 org.keycloak.admin.client.Keycloak 仅公开阻塞 API - 这意味着实现需要阻塞当前线程才能以阻塞方式提供结果。
解决这个问题的唯一方法是 API 的非阻塞 API 版本