Вы можете использовать сервис с областью запроса, который вы внедрили как в фильтр, так и в перехватчик.Например,
public interface RequestScopedService {
void setSomething(Object something);
Object getSomething();
}
public class RequestScopedServiceImpl implements RequestScopedService {
@Override
public void setSomething(Object something) {}
@Override
public Object getSomething() {}
}
Лучше всего использовать интерфейсы, поэтому я сделал это здесь.Чтобы настроить его, вы регистрируете AbstractBinder
с помощью ResourceConfig
1 .
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()
для его настройки, потому что сервис является сервисом с ограниченным объемом запросов (т. Е. Новый создается для каждого запроса), а перехватчик фильтра и записи является одиночными.Таким образом, нам нужен прокси-сервер, который перенаправляет звонки на реальный сервис под капотом 2 .
1.Если вы не используете ResourceConfig
для своей конфигурации (возможно, вы используете web.xml), см. Оба моих ответа в "Внедрение зависимостей с Джерси 2.0 и Что такое класс ResourceConfig вДжерси 2? .
2. Вы можете узнать больше об этом в этой статье