Quarkus Keycloak Reactive - 不断抛出 BlockingNotAllowedException

问题描述 投票:0回答:1

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 因为所有组件都是“反应性”的(或者至少它们都被标记为“反应性”)。

如果您能提供一些帮助,我们将不胜感激。谢谢。

java keycloak quarkus
1个回答
0
投票

多看看这个,这个预期的行为。 原因是 org.keycloak.admin.client.Keycloak 仅公开阻塞 API - 这意味着实现需要阻塞当前线程才能以阻塞方式提供结果。

解决这个问题的唯一方法是 API 的非阻塞 API 版本

© www.soinside.com 2019 - 2024. All rights reserved.