gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:00:33 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com