微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 RestClient 时出现 ContextNotActiveException

如何解决使用 RestClient 时出现 ContextNotActiveException

我目前正在使用 quarkus 开发基于微服务的应用程序。我需要修改 SecurityIdentity(用户通过 oidc 进行身份验证)以注入从另一个微服务检索到的权限列表。我目前正在为此目的使用它:

@ApplicationScoped
public class RolesAugmentor implements SecurityIdentityAugmentor {

    @Inject
    @RestClient
    CoreServiceClient coreServiceClient;

    @Override
    public Uni<SecurityIdentity> augment(SecurityIdentity identity,AuthenticationRequestContext context) {
        return context.runBlocking(build(identity));
    }

    private supplier<SecurityIdentity> build(SecurityIdentity identity) {
        if (identity.isAnonymous()) {
            return () -> identity;
        } else {
            QuarkusSecurityIdentity.Builder builder = QuarkusSecurityIdentity.builder(identity);
            var permissions = coreServiceClient.getPermissions();
            builder.addRoles(new HashSet<>(permissions));
            return builder::build;
        }
    }

}

其中 CoreServiceClient 是用于检索用户权限的 RestEasy RestClient,但是当我运行代码时,我得到一个 javax.ws.rs.ProcessingException:javax.enterprise.context.ContextNotActiveException

知道如何完成这项任务吗?

谢谢 欧盟

解决方法

好的。我现在正在使用上下文传播,它似乎有效。这是更新后的代码。

@ApplicationScoped
public class RolesAugmentor implements SecurityIdentityAugmentor {

    @Inject
    @RestClient
    CoreServiceClient coreServiceClient;

    @Inject
    ThreadContext threadContext;

    @Override
    public Uni<SecurityIdentity> augment(SecurityIdentity identity,AuthenticationRequestContext context) {
        return context.runBlocking(build(identity));
    }

    private Supplier<SecurityIdentity> build(SecurityIdentity identity) {
        return threadContext.contextualSupplier(() -> {
            if (identity.isAnonymous()) {
                return identity;
            } else {
                JsonWebToken jwt = (JsonWebToken) identity.getPrincipal();
                QuarkusSecurityIdentity.Builder builder = QuarkusSecurityIdentity.builder(identity);
                var permissions = coreServiceClient.getPermissions("Bearer " + jwt.getRawToken());
                builder.addRoles(new HashSet<>(permissions));
                return builder.build();
            }
        });
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。