![](/img/trans.png)
[英]Passing parameters between JAX-RS WriterInterceptor and ReaderInterceptor
[英]jax-rs share information between ContainerRequestFilter and ReaderInterceptor
我正在使用Jax-rs,並且在Filters
做了一些邏輯,然后我想在ContainerRequestFilter
(Filter)和ReaderInterceptor
(Interceptor)之間共享信息。
我可以看到通過set/getProperties
在過濾器和攔截器之間是可能的,但是在過濾器和攔截器之間是不可能的。
知道是否還有其他機制嗎?
問候。
您可以使用同時注入到過濾器和攔截器中的請求范圍服務。 例如
public interface RequestScopedService {
void setSomething(Object something);
Object getSomething();
}
public class RequestScopedServiceImpl implements RequestScopedService {
@Override
public void setSomething(Object something) {}
@Override
public Object getSomething() {}
}
使用接口的最佳實踐,這就是為什么我在這里這樣做。 要配置它,請向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);
}
});
}
}
現在,您可以將其注入到過濾器和攔截器中。
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()
方法對其進行配置,因為該服務是一個請求范圍的服務(這意味着將為每個請求創建一個新服務),並且filter和writer攔截器是單例的。 因此,我們需要它作為代理,將請求轉發到引擎蓋2下的真實服務。
1.如果您沒有使用ResourceConfig
進行配置(也許您使用的是web.xml),請參閱“ Jersey 2.0的依賴注入”中的答案,以及Jersey 2中的ResourceConfig類是什么?
因此,比為此使用單獨的服務更簡單的方法是簡單地將ContainerRequestContext
注入ReaderInterceptor
。 我們需要將其作為javax.inject.Provider
注入,以便我們可以懶惰地檢索它。 如果不這樣做,就會遇到范圍問題,因為攔截器本質上是單例,並且請求上下文是請求范圍的(意味着為每個請求創建一個新的)。
public static class MyInterceptor implements ReaderInterceptor {
private final javax.inject.Provider<ContainerRequestContext> requestProvider;
@Inject
public MyInterceptor(javax.inject.Provider<ContainerRequestContext> requestProvider) {
this.requestProvider = requestProvider;
}
@Override
public Object aroundReadFrom(ReaderInterceptorContext readerInterceptorContext) throws IOException, WebApplicationException {
ContainerRequestContext request = requestProvider.get();
String prop = (String) request.getProperty("SomeProp");
}
}
使用javax.inject.Provider
,我們可以通過調用get()
獲得實際的服務。 因為我們使用的是Provider
,所以將從請求范圍內的上下文中檢索服務,這意味着實例將與請求綁定在一起。
1.有關更多信息,請參見請求作用域注入澤西單身人士 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.