当前位置: 首页 > 知识库问答 >
问题:

Jersey 2和Spring Boot-无法在提供程序上使用@Context注入

丘普松
2023-03-14

在Spring Boot 2.4上使用球衣2.3。我有2个JAX遥感服务提供商。其中一个实现了ContainerRequestFilter(预匹配),另一个扩展了JacksonJaxbJsonProvider(来自jackson-jaxrs-json-provider)。

我正在将ContainerRequest estFilter中的属性设置为ContainerRequest estContext。然后我试图使用@Context将ContainerRequest estContext注入另一个JAX-RS提供程序。但是这个注入总是为空。

如果我使用@Context将同一对象注入 JAX-RS 资源,泽西岛会注入它。不知道我在这里错过了什么。任何帮助都受到极大的赞赏。

@PreMatching
@Provider
public class MyJaxRSContextProvider implements ContainerRequestFilter {

    @Context
    Providers providers;

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

@Provider
@Consumes(MediaType.WILDCARD)
@Produces(MediaType.WILDCARD)
public class MyJsonJaxRSProvider extends JacksonJaxbJsonProvider {

    @Context
    ContainerRequestContext requestContext;

    @Override
    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return true;
    }

    @Override
    public Object readFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream) throws IOException {
      //requestcontext is always null
      requestContext.getProperty("myProperty");
    }
}

共有1个答案

蒋原
2023-03-14

需要考虑的事项:

>

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

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

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

  •  类似资料:
    • 我的应用程序中有两个绑定类型的命名实例: 我有一个类,希望每个类使用一个实例。由于技术原因,此类不能直接注入实例,它必须向实例注入提供程序: 问题是,上面的FooPrime注入不是注入名为“prime”的实例,而是注入名为“prime”的提供者,这当然不是我想要的。 如何让Guice为名为“prime”的Foo实例注入一个提供程序?

    • null 如在第一个链接中所回答的,尝试类路径 正如第二个链接中所回答的,尝试了Multidex也没有成功。 注意:示例代码正在运行。 更新: 有趣的是,即使我只添加依赖项,也会出现同样的错误

    • 在和之后 在启动应用程序时,我开始得到以下错误: 在下一行中还添加了:

    • 问题内容: 我做错了什么? 根据文件,我应该能够注入到......但我得到一个错误- “未知供应商” http://jsfiddle.net/g26n3/ 实际上,我在这里有三个问题… 1)如何注入模块的配置。 2)如何向模块配置注入相同的提供程序()。 3)如果我将相同的提供程序注入到两个模块的配置中,它将是相同的提供程序实例,还是两个不同的实例? 谢谢! 问题答案: 您需要添加“ Provid

    • 这是一个奇怪的用例,我需要一些帮助来弄清楚如何相互结合使用辅助/提供者/FactoryModuleBuilders。忽略的缺失。这只是一个例子。 属于我无法更改的库的一组特征具有以下模式。它使用蛋糕图案。 由于这些特征不能被直接注入,我创建了一个允许它们被注入的包装器 在我的代码中,我有一个依赖于服务的控制器,而服务又依赖于库。根据控制器的需要,服务应能够使用“BB”或“CC”。组件如下所示 我将

    • 我正在使用Pact Go实现来尝试合同测试。我做了一个不起作用的提供者测试,因为我需要模拟我的服务对Twilio的请求。 我已经为我的消费者和这个提供者之间的契约创建了一个Pact对象,然后为我的提供者和twilio之间的契约创建了另一个称为twilioPact的对象。我已经为Twilioendpoint添加了一个POST的交互,但是在pact.log中我没有看到它被注册。我的测试正确地发出了请求