java - jax-rs 在 ContainerRequestFilter 和 ReaderInterceptor 之间共享信息

标签 java jersey jax-rs jersey-2.0

我正在使用 Jax-rs,并且我正在 Filters 中执行一些逻辑,然后我想在 ContainerRequestFilter(Filter) 和ReaderInterceptor(拦截器)。

我可以看到,通过set/getProperties可以在过滤器和拦截器之间实现,但在过滤器和拦截器之间是不可能的。

知道是否还有其他机制吗?

问候。

最佳答案

您可以使用注入(inject)到过滤器和拦截器中的请求范围服务。例如

public interface RequestScopedService {
    void setSomething(Object something);
    Object getSomething();
}

public class RequestScopedServiceImpl implements RequestScopedService {
    @Override
    public void setSomething(Object something) {}

    @Override
    public Object getSomething() {}
}

使用接口(interface)是最佳实践,这就是我在这里这样做的原因。要配置它,您需要使用 ResourceConfig 1 注册一个 AbstractBinder

public class JerseyConfig extends ResourceConfig {
    public JerseyConfig() {
        register(new AbstractBinder() {
            @Override
            public void configure() {
                bind(RequestScopedServiceImpl.class)
                        .to(RequestScopedService.class)
                        .proxy(true)
                        .proxyForSameScope(false)
                        .in(RequestScoped.class);
            }
        });
    }
}

现在您可以将其注入(inject)过滤器和拦截器中。

public class MyFilter implements ContainerRequestFilter {
    private final RequestScopedService service;

    @Inject
    public MyFilter(RequestScopedService service) {
        this.service = service;
    }
}

public class MyInterceptor implements ReaderInterceptor {
    private final RequestScopedService service;

    @Inject
    public MyInterceptor(RequestScopedService service) {
        this.service = service;
    }
}

我们使用 proxy() 方法来配置它,因为该服务是一个请求范围的服务(意味着为每个请求创建一个新的服务),并且过滤器和编写器拦截器是单例的。因此,我们需要它作为一个代理,将调用转发到底层的真实服务2

<小时/>

<子>1。如果您没有使用 ResourceConfig 进行配置(也许您使用的是 web.xml),请参阅 my answer in "Dependency Injection with Jersey 2.0What exactly is the ResourceConfig class in Jersey 2?

<子>2。您可以在 this article 中了解更多相关信息

关于java - jax-rs 在 ContainerRequestFilter 和 ReaderInterceptor 之间共享信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52994526/

相关文章:

java - BigDecimal 乘以 100 哪种方法更好?

Spring将请求范围的bean提升到子线程(HttpServletRequest)

websphere - WAS7 上无 Jersey 的 JAX-RS

java - 通过 JAX-RS 实现 REST 服务的可重用性

java - Jersey 基础教程

java - 我应该将生成的类隐藏在一层后面吗?

java - parseLong 方法在 Java 中如何工作?

java - 如何在hibernate中使用注解实现映射?

java - Spring Boot中update方法的实现

java - Jersey:将值从 ContainerRequestFilter 传递到端点