簡體   English   中英

jax-rs在ContainerRequestFilter和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類是什么?

2.您可以在本文中了解更多有關此的信息

因此,比為此使用單獨的服務更簡單的方法是簡單地將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM