Jersey 2 和 Spring Boot - 无法在 Provider 上使用 @Context 进行注入

问题描述

在 Spring Boot 2.4 上使用 Jersey 2.3。我有 2 个 JAX-RS 提供者。其中一个实现了 ContainerRequestFilter(PreMatching),另一个扩展了 JacksonJaxbJsonProvider(来自 jackson-jaxrs-json-provider)。

我正在将 ContainerRequestFilter 中的一个属性设置到 ContainerRequestContext 上。然后我尝试使用 @Context 将 ContainerRequestContext 注入到另一个 JAX-RS 提供程序。但是这种注入总是无效的。

如果我使用@Context 将相同的对象注入 JAX-RS 资源,Jersey 会注入它。不确定我在这里缺少什么。非常感谢任何帮助。

spark.sql("""
    select from_csv(
        '14-ENE-21','date date',map('dateFormat','dd-MMM-yy','locale','ES')
    ).date as date
""").show()
+----------+
|      date|
+----------+
|2021-01-14|
+----------+
@PreMatching
@Provider
public class MyJaxRSContextProvider implements ContainerRequestFilter {

    @Context
    Providers providers;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        requestContext.setProperty("myProperty",property);
    }
}

解决方法

需要考虑的事项:

  • 在某些情况下,如果您将提供程序注册为实例,则可能不会发生注入。最好的办法是将提供者注册为一个类,或者只使用 Jersey 提供的扫描。

  • 某些可注入对象是不可代理的,这将阻止将较小范围的服务注入到较大范围的服务中(例如:将范围对象请求到单例中)。在这种情况下,您应该将注入包裹在 javax.inject.Provider

    @Inject
    private javax.inject.Provider<ContainerRequest> requestProvider;
    
    ...
    ContainerRequest request = requestProvider.get();