0

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

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

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

@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");
    }
}
4

1 回答 1

0

需要考虑的事项:

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

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

    @Inject
    private javax.inject.Provider<ContainerRequest> requestProvider;
    
    ...
    ContainerRequest request = requestProvider.get();
    
于 2021-02-24T13:12:58.197 回答