我正在使用 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.0 和 What exactly is the ResourceConfig class in Jersey 2? 。
<子>2。您可以在 this article 中了解更多相关信息
关于java - jax-rs 在 ContainerRequestFilter 和 ReaderInterceptor 之间共享信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52994526/