Quarkus - 在拦截器中注入请求作用域 bean 时出现 ContextNotActiveException

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

我有一个 Quarkus 应用程序。触发此应用程序的入口点是一个实现 AWS RequestHandler 的类。 在运行之前,我想根据给定的参数字段设置上下文。为了将上下文存储在某处,我创建了一个 requestScoped bean,其中包含一个我们使用简单的 setter 方法设置的字段。

为此我想到使用拦截器。在我的拦截器类中,我注入了这个请求范围的 bean。

运行应用程序时,它会触发拦截器,但我注意到在调试时出现错误。

方法抛出“javax.enterprise.context.ContextNotActiveException”。无法评估 common.service.MyRequestScopedBean_ClientProxy.toString()

我已经在另一个应用程序中运行了它,我在其中触发了一个休息端点。并且没有同样的问题。

Quarkus 平台版本:2.7.5.Final。

为什么这里会抛出 ContextNotActiveException,有办法解决这个问题吗?

@Setter
@Getter
@RequestScoped
public class MyRequestScopedBean {

    private String context;
}

我的InterceptorBinding注释:

@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ContextBinding {
}

ContextInterceptor类:

@Slf4j
@Interceptor
@ContextBinding
public class ContextInterceptor {

    @Inject
    MyRequestScopedBean myRequestScopedBean;

    @AroundInvoke
    public Object setContext(InvocationContext context) throws Exception {

        log.info("{}", context);

        myRequestScopedBean.setContext("Some context");

        return context.proceed();
    }
}

我的处理程序类,带有@AcitivateRequestContext:

@Slf4j
@ActivateRequestContext
@ContextBinding
@Named("Handler")
public class Handler implements RequestHandler<Event, Void> {

    @Override
    public Void handleRequest(Event event, Context context) {
        // some logic
    }
}
java quarkus interceptor requesthandler requestscope
1个回答
0
投票

你的拦截器没有声明

@Priority
。根据规范,不应启用此类拦截器,但 Quarkus 偏离了这一点,并分配了默认优先级
0
。您甚至应该看到此警告:

The interceptor x.y.z.ContextInterceptor does not declare any @Priority.
It will be assigned a default priority value of 0.

根据规范,

@ActivateRequestContext
拦截器具有
PLATFORM_BEFORE + 100
的优先级。

组合起来,这意味着您的拦截器在请求上下文被激活之前运行。您应该明确为您的拦截器分配正确的优先级: @Interceptor @Priority(Interceptor.Priority.LIBRARY_BEFORE + 100) @ContextBinding public class ContextInterceptor { ... }

我毫不犹豫地选择了
LIBRARY_BEFORE + 100

,但在我看来,你的拦截器优先级应该属于“扩展库定义的早期拦截器”类别,所以

LIBRARY_BEFORE + 100
应该是一个好的开始。
    

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