我有一个 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
}
}
你的拦截器没有声明
@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
应该是一个好的开始。