Новый постер здесь, надеюсь, я не нарушаю никаких правил:)
Я использую PrivateModule в google-guice, чтобы иметь несколько источников данных для одной и той же среды. Но мне трудно заставить MethodInterceptor работать внутри приватных модулей.
Ниже приведен простой тестовый пример, который объясняет «проблему».
Простой класс обслуживания будет:
interface Service {
String go();
}
class ServiceImpl implements Service {
@Override @Transactional
public String go() {
return "Test Case...";
}
}
Класс MyModule
будет:
class MyModule extends AbstractModule {
@Override
protected void configure() {
install(new PrivateModule() {
@Override
protected void configure() {
bind(Service.class).to(ServiceImpl.class);
bindInterceptor(
Matchers.any(),
Matchers.annotatedWith(Transactional.class),
new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation i)
throws Throwable {
System.out.println("Intercepting: "
+ i.getMethod().getName());
return i.proceed();
}
});
expose(Service.class);
}
});
}
}
И последний контрольный пример:
public class TestCase {
@Inject Service service;
public TestCase() {
Guice.createInjector(new MyModule()).injectMembers(this);
}
public String go() {
return service.go();
}
public static void main(String[] args) {
TestCase t = new TestCase();
System.out.println(t.go());
}
}
Вы ожидаете, что результат будет:
Intercepting: go
Test Case...
Но этого не происходит, перехватчик не используется, выводится только муравей Test Case...
.
Если я связываю / выставляю ServiceImpl
вместо интерфейса, тогда он работает.
Заранее спасибо,
С Уважением,
LL